`

Qt入门:最傻瓜的Qt Hello world

 
阅读更多

今天在Jeltter的介绍之下,下载了Qt 4.2.2 Win Platform Evaluation for Visual Studio 2003并简单玩了一下,感觉Qt的确是一个很神奇的东西。特别是在它强大的代码生成工具帮助之下,程序员所要写的东西减少许多,能够完成的功能却令人惊讶的增加,甚至超过C++语言所能提供的灵活性——这些特性从一开始就让我不得不称奇。

以下将要讲到的内容都包含在这个工程当中,可以下载看看运行效果。
点击下载此文件

首先要从安装说起。我下载的是Qt的Evaluation版本,安装时需要一个Evaluation序列号,这个序列号可以通过http://www.trolltech.com/products/qt/evaluate来申请。由于Jeltter已经申请了一个,所以我就用他的了,OK,经过一段时间的等待,安装完毕。此时有一个小插曲,就是如何将Evaluation版本“升级”成Commercial版本,这个就期待Jeltter在他的blog上面为我们来介绍了,我就按下不表。

接着,重起Visual Studio 2003,我就可以看到Qt已经无缝的集成到Visual Studio里面去了。

在Visual Studio的菜单上也加入了Qt的内容。

新建项目时,在对话框中也加入了Qt专用的项目向导,相当方便。

新建一个名为HelloQtWindows的项目,使用Qt Application向导所提供的默认配置直接生成程序,一个最简单地程序框架就有了。既然是最傻瓜的编程方法,那编辑对话框的事情当然应该交给资源编辑器来完成了,于是我兴冲冲的打开资源视图,结果什么都没有!原来,Qt的所有界面信息都存在一个*.ui文件里面,在解决方案资源管理器里面双击Form Files/helloqtwindows.ui就可以打开Qt的窗口设计器,粗略的比较发现,它比MFC的窗口设计器强大多了,比.Net的设计器也绝无任何的劣势,相当的好用!

我胡乱的拖动一些控件到这个窗口里面去,就像这样:

好了,直接编译运行,这个窗口就按我所想象的模样出来了。

非常简单就出来一个窗口,那么接下来当然多少是应该给窗口加点功能吧。跟一般流行的设计器一样,在控件上面双击鼠标就可以生成最常用的事件响应函数,同时也可以在控件上单击右键来连接事件(Connect Signal),还可以用Qt菜单里的Qt Signal Slot Editor来将任意对象的任意事件挂接到任意的响应函数上面去。

Qt的事件(Signal)机制实在是其中的一个亮点,据称是通过Qt自己的代码生成工具(moc)辅助各种宏来实现类似于动态语言的Reflection机制,从而使得任意相同参数列表的函数都能够通过QObject::connect连接起来。其调用方式类似于C#里面的event,也就是事件的提供者完全不知道接收者的存在,透明的完成事件触发。关于更多这方面的内容我还要再看看更多的资料,现在我也说不清楚。

现在就以Check Box的stateChanged事件为例,写一些简单的代码。

void HelloQtWindows::on_checkBox_stateChanged(int state)
{
if (Qt::Checked == state)
{
QMessageBox::information(this, tr("Test Title"), tr("Checked me!"));
}
else
{
QMessageBox::information(this, tr("Test Title"), tr("Unchecked me!"));
}
}

在这里,响应了Check Box的状态改变事件,当它被选中时弹出对话框显示“Checked me!”,没有被选中时弹出对话框显示“Unchecked me!”。这里的tr是QObject的静态成员函数,是Qt为了多语言化而做的一个很重要的基础设施,关于它的强大功能,等下我来做一个最简单的介绍。

很明显有一个悬而未决的疑问,Qt把那些控件的声明都放在哪里了?看看helloqtwindows.h吧。

#ifndef HELLOQTWINDOWS_H
#define HELLOQTWINDOWS_H

#include <QtGui/QMainWindow>
#include "ui_helloqtwindows.h"

class HelloQtWindows : public QMainWindow
{
Q_OBJECT

public:
HelloQtWindows(QWidget *parent = 0, Qt::WFlags flags = 0);
~HelloQtWindows();

private:
Ui::HelloQtWindowsClass ui;

private slots:
void on_checkBox_stateChanged(int);
};

#endif // HELLOQTWINDOWS_H

对了,就是这个叫做ui的成员变量了!这里的Ui::HelloQtWindowsClass则是窗口设计器自动生成的代码,生成的结果放在Generated Files/ui_helloqtwindows.h里面。比如说实现这样一个功能,当Check Box选中时,将Calendar控件禁用,为选中时启用。

void HelloQtWindows::on_checkBox_stateChanged(int state)
{
if (Qt::Checked == state)
{
QMessageBox::information(this, tr("Test Title"), tr("Checked me!"));
ui.calendarWidget->setEnabled(false);
}
else
{
QMessageBox::information(this, tr("Test Title"), tr("Unchecked me!"));
ui.calendarWidget->setEnabled(true);
}
}

这样就可以了!其中calendarWidget是控件的名字,如果需要修改,应直接在窗口设计器里操作,可千万不要去修改自动生成的代码。

最后我来说说多语言化的问题。Qt有一个叫做QtLinguist的工具可以很方便的实现多语言化,具体操作如下:

  1. 使用Qt菜单上的Create New Translation File...命令创建一个语言文件,可以选择很多种不同的语言,比如我选择了中文(zh),生成一个helloqtwindows_zh.ts;
  2. 找到解决方案中的Translation Files/helloqtwindows_zh.ts,在文件上单击右键,选择Open with Qt Linguist...命令,用Qt Linguist打开这个文件;
  3. 在Qt Linguist里面将每一个句子手动翻译,其中,这些单词正是我用QObject::tr标出的所有句子;
  4. 保存,然后在main函数中增加下面一段代码:
    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);
    QTranslator translator;
    translator.load("helloqtwindows_zh");
    app.installTranslator(&translator);
    HelloQtWindows w;
    w.show();
    app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
    return app.exec();
    }
  5. 最后,还是在那个ts文件上单击右键,选择Run lrelease命令,生成qm文件,这样再运行程序整个界面就变成中文的了!

程序运行的界面如图所示:

Qt Linguist的界面如图所示:

这里要注意一下,如果程序在源码中修改了任何的内容,在发布之前一定在ts文件上面按右键,选择Run lupdate命令重新生成ts文件,Qt会很智能的把所有内容改变的字符串或新增的字符串更新,在Qt Linguist里面的Context视图中显示为问号,让我们一个都不会漏过。真的是方便到家了!

OK,最简单的Hello world应该到此为止了,这就是今天的全部内容。Qt有一个Qt Assistant,它的功能就像是MSDN一样,提供了所有设施的说明和简单示例,同时还有一个Qt Examples and Demos,它包含很多的Examples,是学习Qt的最好参照物。在网上还可以找到C++ GUIProgramming with Qt4这本书,对Qt的介绍非常的简单明了,很值得一看(我才刚刚开始翻,看完了再给大家介绍)。还有网上的各种资源,灵活使用搜索引擎吧!


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics