1、一、Qt Creator的安装和hello world程序的编写(原创) 1.首先到Qt的官方网站上下载Qt Creator,这里我们下载windows版的。 下载地址:http:/ 如下图我们下载:Download Qt SDK for Windows* (178Mb) 下载完成后,直接安装即可,安装过程中按默认设置即可。 2.运行Qt Creator,首先弹出的是欢迎界面,这里可以打开其自带的各种演示程序。 3.我们用File-New菜单来新建工程。 4.这里我们选择Qt4 Gui Application。 5.下面输入工程名和要保存到的文件夹路径。我们这里的工程名为helloworld。
2、 6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以直接点击Next。 7.我们将base class选为QDialog对话框类。然后点击Next。 8.点击Finish,完成工程的建立。 9.我们可以看见工程中的所有文件都出现在列表中了。我们可以直接按下下面的绿色的run按钮或者按下Ctrl+R快捷键运行程序。 10.程序运行会出现空白的对话框,如下图。 11.我们双击文件列表的dialog.ui文件,便出现了下面所示的图形界面编辑界面。 12.我们在右边的器件栏里找到Label标签器件 13.按着鼠标左键将其拖到设计窗口上,如下图。 14.我们双击它,并将其内容改为h
3、elloworld。 15.我们在右下角的属性栏里将字体大小由9 改为15。 16.我们拖动标签一角的蓝点,将全部文字显示出来。 17.再次按下运行按钮,便会出现helloworld。 到这里helloworld程序便完成了。 Qt Creator编译的程序,在其工程文件夹下会有一个debug文件夹,其中有程序的.exe可执行文件。但Qt Creator默认是用动态链接的,就是可执行程序在运行时需要相应的.dll文件。我们点击生成的.exe文件,首先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。”表示缺少mingwm10.dll文件。
4、解决这个问题我们可以将相应的.dll文件放到系统中。在Qt Creator的安装目录的qt文件下的 bin文件夹下(我安装在了D盘,所以路径是D:Qt2009.04qtbin),可以找到所有的相关.dll文件。在这里找到mingwm10.dll文件,将其复制到C:WINDOWSsystem文件夹下,即可。下面再提示缺少什么dll文件,都像这样解决就可以了。 二、Qt Creator 编写多窗口程序(原创) 实现功能: 程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话
5、框,都会回到主窗口。 实现原理: 程序里我们先建立一个主工程,作为主界面,然后再建立一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。 实现过程: 1.首先新建Qt4 Gui Application工程,工程名为nGui,Base class选为QWidget。建立好后工程文件列表如下图。 2.新建对话框类,如下图,在新建中,选择Qt Designer Form Class。 3.选择Dialog without Buttons。 4.类名设为myDlg。 5.点击Finish完成。注意这里已经默认将其加入到了我们刚建的工程中了。 6.如下图,在mydlg.ui中拖
6、入一个Push Button,将其上的文本改为“进入主窗口”,在其属性窗口中将其objectName改为 enterBtn,在下面的Signals and slots editor中进行信号和槽的关联,其中,Sender设为enterBtn,Signal设为clicked(),Receive设为myDlg,Slot设为accept()。这样就实现了单击这个按钮使这个对话框关闭并发出Accepted 信号的功能。下面我们将利用这个信号。 7.修改主函数main.cpp,如下: #include #include “widget.h“ #include “mydlg.h“ /加入头文件 int m
7、ain(int argc, char *argv) QApplication a(argc, argv); Widget w; myDlg my1; /建立自己新建的类的对象my1 if(my1.exec()=QDialog:Accepted) /利用Accepted信号判断enterBtn是否被按下 w.show(); /如果被按下,显示主窗口 return a.exec(); /程序一直执行,直到主窗口关闭 else return 0; /如果没被按下,则不会进入主窗口,整个程序结束运行 主函数必须这么写,才能完成所要的功能。 如果主函数写成下面这样: #include #include
8、“widget.h“ #include “mydlg.h“ int main(int argc, char *argv) QApplication a(argc, argv); myDlg my1; if(my1.exec()=QDialog:Accepted) Widget w; w.show(); return a.exec(); 这样,因为w是在if语句里定义的,所以当if语句执行完后它就无效了。这样导致的后果就是,按下enterBtn后,主界面窗口一闪就没了。如果此时对程序改动了,再次点击运行时,就会出现error: collect2: ld returned 1 exit statu
9、s的错误。这是因为虽然主窗口没有显示,但它只是隐藏了,程序并没有结束,而是在后台运行。所以这时改动程序,再运行时便会出错。你可以按下调试栏上面的红色Stop停止按钮来停止程序运行。你也可以在windows任务管理器的进程中将该进程结束,而后再次运行就没问题了,当然先关闭Qt Creator,而后再重新打开,这样也能解决问题。 如果把程序改为这样: #include #include “widget.h“ #include “mydlg.h“ int main(int argc, char *argv) QApplication a(argc, argv); myDlg my1; Widget
10、w; if(my1.exec()=QDialog:Accepted) w.show(); return a.exec(); 这样虽然解决了上面主窗口一闪而过的问题,但是,如果在my1对话框出现的时候不点enterBtn,而是直接关闭对话框,那么此时整个程序应该结束执行,但是事实是这样的吗?如果你此时对程序进行了改动,再次按下run按钮,你会发现又出现了error: collect2: ld returned 1 exit status的错误,这说明程序并没有结束,我们可以打开windows任务管理器,可以看到我们的程序仍在执行。 因为return a.exec();一句表示只要主窗口界面不退出
11、,那么程序就会一直执行。所以只有用第一种方法,将该语句也放到if语句中,而在else语句中用else return 0; ,这样如果enterBtn没有被按下,那么程序就会结束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出另一个界面的程序。下面我们在主窗口上加一个按钮,按下该按钮,弹出一个对话框,但这个对话框关闭,不会使主窗口关闭。 8.如下图,在主窗口加入按钮,显示文本为“弹出一个对话框”,在其上点击鼠标右键,在弹出的菜单中选择go to slot。 9.我们选择单击事件clicked()。 10.我们在弹出的槽函数中添加一句: my2.show(); my2为我们新建对话框类的另
12、一个对象,但是my2我们还没有定义,所以在widget.h文件中添加相应代码,如下,先加入头文件,再加入my2的定义语句,这里我们将其放到private里,因为一般的函数都放在public里,而变量都放在private里。 #ifndef WIDGET_H #define WIDGET_H #include #include “mydlg.h“ /包含头文件 namespace Ui class Widget; class Widget : public QWidget Q_OBJECT public: Widget(QWidget *parent = 0); Widget(); privat
13、e: Ui:Widget *ui; myDlg my2; /对my2进行定义 private slots: void on_pushButton_clicked(); ; #endif / WIDGET_H 到这里,再运行程序,便能完成我们实验要求的功能了。整个程序里,我们用两种方法实现了信号和槽函数的关联,第一个按钮我们直接在设计器中实现其关联;第二个按钮我们自己写了槽函数语句,其实图形的设计与直接写代码效果是一样的。 这个程序里我们实现了两类窗口打开的方式,一个是自身消失而后打开另一个窗口,一个是打开另一个窗口而自身不消失。可以看到他们实现的方法是不同的。 三、Qt Creator 登录对
14、话框(原创) 实现功能: 在弹出对话框中填写用户名和密码,按下登录按钮,如果用户名和密码均正确则进入主窗口,如果有错则弹出警告对话框。 实现原理: 通过上节的多窗口原理实现由登录对话框进入主窗口,而用户名和密码可以用if语句进行判断。 实现过程: 1.先新建Qt4 Gui Application工程,工程名为mainWidget,选用QWidget作为Base class,这样便建立了主窗口。文件列表如下: 2.然后新建一个Qt Designer Form Class类,类名为loginDlg,选用Dialog without Buttons,将其加入上面的工程中。文件列表如下: 3.在log
15、indlg.ui中设计下面的界面:行输入框为Line Edit。其中用户名后面的输入框在属性中设置其object Name为usrLineEdit,密码后面的输入框为pwdLineEdit,登录按钮为loginBtn,退出按钮为exitBtn。 4.将exitBtn的单击后效果设为退出程序,关联如下: 5.右击登录按钮选择go to slot,再选择clicked(),然后进入其单击事件的槽函数,写入一句 void loginDlg:on_loginBtn_clicked() accept(); 6.改写main.cpp: #include #include “widget.h“ #inclu
16、de “logindlg.h“ int main(int argc, char *argv) QApplication a(argc, argv); Widget w; loginDlg login; if(login.exec()=QDialog:Accepted) w.show(); return a.exec(); else return 0; 7.这时执行程序,可实现按下登录按钮进入主窗口,按下退出按钮退出程序。 8.添加用户名密码判断功能。将登陆按钮的槽函数改为: void loginDlg:on_loginBtn_clicked() if(m_ui-usrLineEdit-text
17、()=tr(“qt“) else QMessageBox:warning(this,tr(“Warning“),tr(“user name or password error!“),QMessageBox:Yes); /如果不正确,弹出警告对话框 并在logindlg.cpp中加入#include 的头文件。如果不加这个头文件,QMessageBox类不可用。 9.这时再执行程序,输入用户名为qt,密码为123456,按登录按钮便能进入主窗口了,如果输入错了,就会弹出警告对话框。 如果输入错误,便会弹出警告提示框: 10.在logindlg.cpp的loginDlg类构造函数里,添上初始化语句
18、,使密码显示为小黑点。 loginDlg:loginDlg(QWidget *parent) : QDialog(parent), m_ui(new Ui:loginDlg) m_ui-setupUi(this); m_ui-pwdLineEdit-setEchoMode(QLineEdit:Password); 效果如下: 11.如果输入如下图中的用户名,在用户名前不小心加上了一些空格,结果程序按错误的用户名对待了。 我们可以更改if判断语句,使这样的输入也算正确。 void loginDlg:on_loginBtn_clicked() if(m_ui-usrLineEdit-text().
19、trimmed()=tr(“qt“) else QMessageBox:warning(this,tr(“Warning“),tr(“user name or password error!“),QMessageBox:Yes); 加入的这个函数的作用就是移除字符串开头和结尾的空白字符。 12.最后,如果输入错误了,重新回到登录对话框时,我们希望可以使用户名和密码框清空并且光标自动跳转到用户名输入框,最终的登录按钮的单击事件的槽函数如下: void loginDlg:on_loginBtn_clicked() if(m_ui-usrLineEdit-text().trimmed()=tr(“q
20、t“) else QMessageBox:warning(this,tr(“Warning“),tr(“user name or password error!“),QMessageBox:Yes); /如果不正确,弹出警告对话框 m_ui-usrLineEdit-clear();/清空用户名输入框 m_ui-pwdLineEdit-clear();/清空密码输入框 m_ui-usrLineEdit-setFocus();/将光标转到用户名输入框 四、Qt Creator 添加菜单图标(原创) 在下面的几节,我们讲述Qt 的MainWindow主窗口部件。这一节只讲述怎样在其上的菜单栏里添加菜
21、单和图标。 1.新建Qt4 Gui Application工程,将工程命名为MainWindow,其他选项默认即可。 生成的窗口界面如下图。其中最上面的为菜单栏。 2.我们在Type Here那里双击,并输入“文件(&F)”,这样便可将其文件菜单的快捷键设为Alt+F。(注意括号最好用英文半角输入,这样看着美观) 3.输入完按下Enter键确认即可,然后在子菜单中加入“新建(&N)”,确定后,效果如下图。 4.我们在下面的动作编辑窗口可以看到新加的“新建”菜单。 5.双击这一条,可打开它的编辑对话框。我们看到Icon项,这里可以更改“新建”菜单的图标。 6.我们点击后面的.号,进入资源选择器,
22、但现在这里面是空的。所以下面我们需要给该工程添加外部资源。 7.添加资源有两种方法。一种是直接添加系统提供的资源文件,然后选择所需图标。另一种是自己写资源文件。我们主要介绍第一种。新建Qt Resources file,将它命名为menu。其他默认。 8.添加完后如下图。可以看到添加的文件为menu.qrc。 9.我们最好先在工程文件夹里新建一个文件夹,如images,然后将需要的图标文件放到其中。 10.在Qt Creator的menu.qrc文件中,我们点击Add下拉框,选择Add Prefix。我们可以将生成的/new/prefix前缀改为其他名字,如/File。 11.然后再选择Add
23、下拉框,选择Add Files。再弹出的对话框中,我们到新建的images文件夹下,将里面的图标文件全部添加过来。 12.添加完成后,我们在Qt Creator 的File菜单里选择Save All选项,保存所做的更改。 13.这时再打开资源选择器,可以看到我们的图标都在这里了。(注意:如果不显示,可以按一下上面的Reload按钮) 14.我们将new.png作为“新建”菜单的图标,然后点击Shortcut,并按下Crtl+N,便能将Crtl+N作为“新建”菜单的快捷键。 15.这时打开文件菜单,可以看到“新建”菜单已经有图标了。 运行程序后效果如下。 16.我们在工程文件夹下查看建立的men
24、u.qrc 文件,可以用写字板将它打开。 其具体内容如下。 附:第二种添加资源文件的方法。 1.首先右击工程文件夹,在弹出的菜单中选择Add New,添加新文件。也可以用File中的添加新文件。 2.我们选择文本文件。 3.将文件名设置为menu.qrc。 4.添加好文件后将其内容修改如下。可以看到就是用第一种方法生成的menu.qrc文件的内容。 5.保存文件后,在资源管理器中可以看到添加的图标文件。 五、Qt Creator 布局管理器的使用(原创) 上篇讲解了如何在Qt Creator中添加资源文件,并且为菜单添加了图标。这次我们先对那个界面进行一些完善,然后讲解一些布局管理器的知识。
25、首先对菜单进行完善。 1.我们在上一次的基础上再加入一些常用菜单。 “文件”的子菜单如下图。中间的分割线可以点击Add Separator添加。 “编辑”子菜单的内容如下。 “帮助”子菜单的内容如下。 2.我们在动作编辑器中对各个菜单的属性进行设置。 如下图。 3.我们拖动“新建”菜单的图标,将其放到工具栏里。 拖动“新建”菜单的图标。 将其放到菜单栏下面的工具栏里。 4.我们再添加其他几个图标。使用Append Separator可以添加分割线。 5.最终效果如下。如果需要删除图标,可以在图标上点击右键选择Remove action即可。 下面简述一下布局管理器。 (这里主要以垂直布局管理器
26、进行讲解,其他类型管理器用法与之相同,其效果可自己验证。) 1.在左边的器件栏里拖入三个PushButton和一个Vertical Layout(垂直布局管理器)到中心面板。如下图。 2.将这三个按钮放入垂直布局管理器,效果如下。可以看到按钮垂直方向排列,并且宽度可以改变,但高度没有改变。 3.我们将布局管理器整体选中,按下上面工具栏的Break Layout按钮,便可取消布局管理器。(我们当然也可以先将按钮移出,再按下Delete键将布局管理器删除。) 4.下面我们改用分裂器部件(QSplitter)。 先将三个按钮同时选中,再按下上面工具栏的Lay Out Vertically in Splitter(垂直分裂器)。 效果如下图。可以看到按钮的大小可以随之改动。这也就是分裂器和布局管理器的分别。 5.其实布局管理器不但能控制器件的布局,还有个很重要的用途是,它能使器件的大小随着窗口大小的改变而改变。 我们先在主窗口的中心拖入一个文本编辑器Text Edit。 这时直接运行程序,效果如下。可以看到它的大小和位置不会随着窗口改变。