Qt入门:最傻瓜的Qt Hello world
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_OBJECTpublic:
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有一个叫做Qt Linguist的工具可以很方便的实现多语言化,具体操作如下:
-
使用Qt菜单上的Create New Translation File...命令创建一个语言文件,可以选择很多种不同的语言,比如我选择了中文(zh),生成一个helloqtwindows_zh.ts;
-
找到解决方案中的Translation Files/helloqtwindows_zh.ts,在文件上单击右键,选择Open with Qt Linguist...命令,用Qt Linguist打开这个文件;
-
在Qt Linguist里面将每一个句子手动翻译,其中,这些单词正是我用QObject::tr标出的所有句子;
-
保存,然后在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();
}
-
最后,还是在那个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++ GUI Programming with Qt4这本书,对Qt的介绍非常的简单明了,很值得一看(我才刚刚开始翻,看完了再给大家介绍)。还有网上的各种资源,灵活使用搜索引擎吧!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述