Qt.docx
- 文档编号:4670118
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:55
- 大小:1.04MB
Qt.docx
《Qt.docx》由会员分享,可在线阅读,更多相关《Qt.docx(55页珍藏版)》请在冰豆网上搜索。
Qt
QtCreator教程
利用QtCreator1.2.1(BuiltonSep302009at05:
21:
42)编译程序经常会出现error:
collect2:
ldreturned1exitstatus的错误,但是自己的程序没有一点问题,怎么回事呢?
如果这时退出软件,再重新进入,打开刚才的工程,重新编译,就不会出现刚才的错误了。
这应该是QtCreator软件的问题吧!
后来发现是因为上次执行的程序还在运行,你打开windows的任务管理器中的进程可以看见你刚才运行的程序还在执行,我们看不见,是因为它在后台执行着。
出现这个现象,是因为你写的代码的问题,比如在main函数里用了w.show();语句,就可能出现界面一闪而过,但它并没有关闭,而是在后台运行,所以再次运行时就会出错。
我们可以在资源管理器中将该进程关闭,或者像上面那样直接关闭QtCreator。
示例:
#include
#include"widget.h"
#include"logindlg.h"
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
loginDlgm;
if(m.exec()==QDialog:
:
Accepted)
{
Widgetw;
w.show();
}
returna.exec();
}
执行后就会在后台运行。
这时如果修改了代码再次运行程序,就会出现上面的错误。
在任务管理器中可以看见自己的程序:
将该进程结束,然后在重新运行,就不会出错了。
正确的代码应该这样写:
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
loginDlgm;
Widgetw;
if(m.exec()==QDialog:
:
Accepted)
{
w.show();
returna.exec();
}
elsereturn0;//关闭整个程序
}
这样新建的对象w就不是局部变量了,这样运行程序w表示的窗口不会一闪而过,会一直显示。
程序也不会再出现上面的错误了。
一、QtCreator的安装和helloworld程序的编写(原创)1.首先到Qt的官方网站上下载QtCreator,这里我们下载windows版的。
下载地址:
QtSDKforWindows*(178Mb)
下载完成后,直接安装即可,安装过程中按默认设置即可。
2.运行QtCreator,首先弹出的是欢迎界面,这里可以打开其自带的各种演示程序。
3.我们用File->New菜单来新建工程。
4.这里我们选择Qt4GuiApplication。
5.下面输入工程名和要保存到的文件夹路径。
我们这里的工程名为helloworld。
6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以直接点击Next。
7.我们将baseclass选为QDialog对话框类。
然后点击Next。
8.点击Finish,完成工程的建立。
9.我们可以看见工程中的所有文件都出现在列表中了。
我们可以直接按下下面的绿色的run按钮或者按下Ctrl+R快捷键运行程序。
10.程序运行会出现空白的对话框,如下图。
11.我们双击文件列表的dialog.ui文件,便出现了下面所示的图形界面编辑界面。
12.我们在右边的器件栏里找到Label标签器件
13.按着鼠标左键将其拖到设计窗口上,如下图。
14.我们双击它,并将其内容改为helloworld。
15.我们在右下角的属性栏里将字体大小由9改为15。
16.我们拖动标签一角的蓝点,将全部文字显示出来。
17.再次按下运行按钮,便会出现helloworld。
到这里helloworld程序便完成了。
QtCreator编译的程序,在其工程文件夹下会有一个debug文件夹,其中有程序的.exe可执行文件。
但QtCreator默认是用动态链接的,就是可执行程序在运行时需要相应的.dll文件。
我们点击生成的.exe文件,首先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。
重新安装应用程序可能会修复此问题。
”表示缺少mingwm10.dll文件。
解决这个问题我们可以将相应的.dll文件放到系统中。
在QtCreator的安装目录的qt文件下的bin文件夹下(我安装在了D盘,所以路径是D:
\Qt\2009.04\qt\bin),可以找到所有的相关.dll文件。
在这里找到mingwm10.dll文件,将其复制到C:
\WINDOWS\system文件夹下,即可。
下面再提示缺少什么dll文件,都像这样解决就可以了。
二、QtCreator编写多窗口程序(原创)
实现功能:
程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。
当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。
实现原理:
程序里我们先建立一个主工程,作为主界面,然后再建立一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。
实现过程:
1.首先新建Qt4GuiApplication工程,工程名为nGui,Baseclass选为QWidget。
建立好后工程文件列表如下图。
2.新建对话框类,如下图,在新建中,选择QtDesignerFormClass。
3.选择DialogwithoutButtons。
4.类名设为myDlg。
5.点击Finish完成。
注意这里已经默认将其加入到了我们刚建的工程中了。
6.如下图,在mydlg.ui中拖入一个PushButton,将其上的文本改为“进入主窗口”,在其属性窗口中将其objectName改为enterBtn,在下面的Signalsandslotseditor中进行信号和槽的关联,其中,Sender设为enterBtn,Signal设为clicked(),Receive设为myDlg,Slot设为accept()。
这样就实现了单击这个按钮使这个对话框关闭并发出Accepted信号的功能。
下面我们将利用这个信号。
7.修改主函数main.cpp,如下:
#include
#include"widget.h"
#include"mydlg.h" //加入头文件
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
Widgetw;
myDlgmy1; //建立自己新建的类的对象my1
if(my1.exec()==QDialog:
:
Accepted) //利用Accepted信号判断enterBtn是否被按下
{
w.show(); //如果被按下,显示主窗口
returna.exec(); //程序一直执行,直到主窗口关闭
}
elsereturn0; //如果没被按下,则不会进入主窗口,整个程序结束运行
}
主函数必须这么写,才能完成所要的功能。
如果主函数写成下面这样:
#include
#include"widget.h"
#include"mydlg.h"
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
myDlgmy1;
if(my1.exec()==QDialog:
:
Accepted)
{
Widgetw;
w.show();
}
returna.exec();
}
这样,因为w是在if语句里定义的,所以当if语句执行完后它就无效了。
这样导致的后果就是,按下enterBtn后,主界面窗口一闪就没了。
如果此时对程序改动了,再次点击运行时,就会出现error:
collect2:
ldreturned1exitstatus的错误。
这是因为虽然主窗口没有显示,但它只是隐藏了,程序并没有结束,而是在后台运行。
所以这时改动程序,再运行时便会出错。
你可以按下调试栏上面的红色Stop停止按钮来停止程序运行。
你也可以在windows任务管理器的进程中将该进程结束,而后再次运行就没问题了,当然先关闭QtCreator,而后再重新打开,这样也能解决问题。
如果把程序改为这样:
#include
#include"widget.h"
#include"mydlg.h"
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
myDlgmy1;
Widgetw;
if(my1.exec()==QDialog:
:
Accepted)
{
w.show();
}
returna.exec();
}
这样虽然解决了上面主窗口一闪而过的问题,但是,如果在my1对话框出现的时候不点enterBtn,而是直接关闭对话框,那么此时整个程序应该结束执行,但是事实是这样的吗?
如果你此时对程序进行了改动,再次按下run按钮,你会发现又出现了error:
collect2:
ldreturned1exitstatus的错误,这说明程序并没有结束,我们可以打开windows任务管理器,可以看到我们的程序仍在执行。
因为returna.exec();一句表示只要主窗口界面不退出,那么程序就会一直执行。
所以只有用第一种方法,将该语句也放到if语句中,而在else语句中用elsereturn0;,这样如果enterBtn没有被按下,那么程序就会结束执行了。
到这里,我们就实现了一个界面结束执行,然后弹出另一个界面的程序。
下面我们在主窗口上加一个按钮,按下该按钮,弹出一个对话框,但这个对话框关闭,不会使主窗口关闭。
8.如下图,在主窗口加入按钮,显示文本为“弹出一个对话框”,在其上点击鼠标右键,在弹出的菜单中选择gotoslot。
9.我们选择单击事件clicked()。
10.我们在弹出的槽函数中添加一句:
my2.show();
my2为我们新建对话框类的另一个对象,但是my2我们还没有定义,所以在widget.h文件中添加相应代码,如下,先加入头文件,再加入my2的定义语句,这里我们将其放到private里,因为一般的函数都放在public里,而变量都放在private里。
#ifndefWIDGET_H
#defineWIDGET_H
#include
#include"mydlg.h" //包含头文件
namespaceUi
{
classWidget;
}
classWidget:
publicQWidget
{
Q_OBJECT
public:
Widget(QWidget*parent=0);
~Widget();
private:
Ui:
:
Widget*ui;
myDlgmy2; //对my2进行定义
privateslots:
voidon_pushButton_clicked();
};
#endif//WIDGET_H
到这里,再运行程序,便能完成我们实验要求的功能了。
整个程序里,我们用两种方法实现了信号和槽函数的关联,第一个按钮我们直接在设计器中实现其关联;第二个按钮我们自己写了槽函数语句,其实图形的设计与直接写代码效果是一样的。
这个程序里我们实现了两类窗口打开的方式,一个是自身消失而后打开另一个窗口,一个是打开另一个窗口而自身不消失。
可以看到他们实现的方法是不同的。
三、QtCreator登录对话框(原创)
实现功能:
在弹出对话框中填写用户名和密码,按下登录按钮,如果用户名和密码均正确则进入主窗口,如果有错则弹出警告对话框。
实现原理:
通过上节的多窗口原理实现由登录对话框进入主窗口,而用户名和密码可以用if语句进行判断。
实现过程:
1.先新建Qt4GuiApplication工程,工程名为mainWidget,选用QWidget作为Baseclass,这样便建立了主窗口。
文件列表如下:
2.然后新建一个QtDesignerFormClass类,类名为loginDlg,选用DialogwithoutButtons,将其加入上面的工程中。
文件列表如下:
3.在logindlg.ui中设计下面的界面:
行输入框为LineEdit。
其中用户名后面的输入框在属性中设置其objectName为usrLineEdit,密码后面的输入框为pwdLineEdit,登录按钮为loginBtn,退出按钮为exitBtn。
4.将exitBtn的单击后效果设为退出程序,关联如下:
5.右击登录按钮选择gotoslot,再选择clicked(),然后进入其单击事件的槽函数,写入一句
voidloginDlg:
:
on_loginBtn_clicked()
{
accept();
}
6.改写main.cpp:
#include
#include"widget.h"
#include"logindlg.h"
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
Widgetw;
loginDlglogin;
if(login.exec()==QDialog:
:
Accepted)
{
w.show();
returna.exec();
}
elsereturn0;
}
7.这时执行程序,可实现按下登录按钮进入主窗口,按下退出按钮退出程序。
8.添加用户名密码判断功能。
将登陆按钮的槽函数改为:
voidloginDlg:
:
on_loginBtn_clicked()
{
if(m_ui->usrLineEdit->text()==tr("qt")&&m_ui->pwdLineEdit->text()==tr("123456"))
//判断用户名和密码是否正确
accept();
else{
QMessageBox:
:
warning(this,tr("Warning"),tr("usernameorpassworderror!
"),QMessageBox:
:
Yes);
//如果不正确,弹出警告对话框
}
}
并在logindlg.cpp中加入#include
如果不加这个头文件,QMessageBox类不可用。
9.这时再执行程序,输入用户名为qt,密码为123456,按登录按钮便能进入主窗口了,如果输入错了,就会弹出警告对话框。
如果输入错误,便会弹出警告提示框:
10.在logindlg.cpp的loginDlg类构造函数里,添上初始化语句,使密码显示为小黑点。
loginDlg:
:
loginDlg(QWidget*parent):
QDialog(parent),
m_ui(newUi:
:
loginDlg)
{
m_ui->setupUi(this);
m_ui->pwdLineEdit->setEchoMode(QLineEdit:
:
Password);
}
效果如下:
11.如果输入如下图中的用户名,在用户名前不小心加上了一些空格,结果程序按错误的用户名对待了。
我们可以更改if判断语句,使这样的输入也算正确。
voidloginDlg:
:
on_loginBtn_clicked()
{
if(m_ui->usrLineEdit->text().trimmed()==tr("qt")&&m_ui->pwdLineEdit->text()==tr("123456"))
accept();
else{
QMessageBox:
:
warning(this,tr("Warning"),tr("usernameorpassworderror!
"),QMessageBox:
:
Yes);
}
}
加入的这个函数的作用就是移除字符串开头和结尾的空白字符。
12.最后,如果输入错误了,重新回到登录对话框时,我们希望可以使用户名和密码框清空并且光标自动跳转到用户名输入框,最终的登录按钮的单击事件的槽函数如下:
voidloginDlg:
:
on_loginBtn_clicked()
{
if(m_ui->usrLineEdit->text().trimmed()==tr("qt")&&m_ui->pwdLineEdit->text()==tr("123456"))
//判断用户名和密码是否正确
accept();
else{
QMessageBox:
:
warning(this,tr("Warning"),tr("usernameorpassworderror!
"),QMessageBox:
:
Yes);
//如果不正确,弹出警告对话框
m_ui->usrLineEdit->clear();//清空用户名输入框
m_ui->pwdLineEdit->clear();//清空密码输入框
m_ui->usrLineEdit->setFocus();//将光标转到用户名输入框
}
}
最终的loginDlg.cpp文件如下图:
四、QtCreator添加菜单图标(原创)
在下面的几节,我们讲述Qt的MainWindow主窗口部件。
这一节只讲述怎样在其上的菜单栏里添加菜单和图标。
1.新建Qt4GuiApplication工程,将工程命名为MainWindow,其他选项默认即可。
生成的窗口界面如下图。
其中最上面的为菜单栏。
2.我们在TypeHere那里双击,并输入“文件(&F)”,这样便可将其文件菜单的快捷键设为Alt+F。
(注意括号最好用英文半角输入,这样看着美观)
3.输入完按下Enter键确认即可,然后在子菜单中加入“新建(&N)”,确定后,效果如下图。
4.我们在下面的动作编辑窗口可以看到新加的“新建”菜单。
5.双击这一条,可打开它的编辑对话框。
我们看到Icon项,这里可以更改“新建”菜单的图标。
6.我们点击后面的...号,进入资源选择器,但现在这里面是空的。
所以下面我们需要给该工程添加外部资源。
7.添加资源有两种方法。
一种是直接添加系统提供的资源文件,然后选择所需图标。
另一种是自己写资源文件。
我们主要介绍第一种。
新建QtResourcesfile,将它命名为menu。
其他默认。
8.添加完后如下图。
可以看到添加的文件为menu.qrc。
9.我们最好先在工程文件夹里新建一个文件夹,如images,然后将需要的图标文件放到其中。
10.在QtCreator的menu.qrc文件中,我们点击Add下拉框,选择AddPrefix。
我们可以将生成的/new/prefix前缀改为其他名字,如/File。
11.然后再选择Add下拉框,选择AddFiles。
再弹出的对话框中,我们到新建的images文件夹下,将里面的图标文件全部添加过来。
12.添加完成后,我们在QtCreator的File菜单里选择SaveAll选项,保存所做的更改。
13.这时再打开资源选择器,可以看到我们的图标都在这里了。
(注意:
如果不显示,可以按一下上面的Reload按钮)
14.我们将new.png作为“新建”菜单的图标,然后点击Shortcut,并按下Crtl+N,便能将Crtl+N作为“新建”菜单的快捷键。
15.这时打开文件菜单,可以看到“新建”菜单已经有图标了。
运行程序后效果如下。
16.我们在工程文件夹下查看建立的menu.qrc文件,可以用写字板将它打开。
其具体内容如下。
附:
第二种添加资源文件的方法。
1.首先右击工程文件夹,在弹出的菜单中选择AddNew,添加新文件。
也可以用File中的添加新文件。
2.我们选择文本文件。
3.将文件名设置为menu.qrc。
4.添加好文件后将其内容修改如下。
可以看到就是用第一种方法生成的menu.qrc文件的内容。
5.保存文件后,在资源管理器中可以看到添加的图标文件。
五、QtCreator布局管理器的使用(原创)
上篇讲解了如何在QtCreator中添加资源文件,并且为菜单添加了图标。
这次我们先对那个界面进行一些完善,然后讲解一些布局管理器的知识。
首先对菜单进行完善。
1.我们在上一次的基础上再加入一些常用菜单。
“文件”的子菜单如下图。
中间的分割线可以点击AddSeparator添加。
“编辑”子菜单的内容如下。
“帮助”子菜单的内容如下。
2.我们在动作编辑器中对各个菜单的属性进行设置。
如下图。
3.我们拖动“新建”菜单的图标,将其放到工具栏里。
拖动“新建”菜单的图标。
将其放到菜单栏下面的工具栏里。
4.我们再添加其他几个图标。
使用AppendSeparator可以添加分割线。
5.最终效果如下。
如果需要删除图标,可以在图标上点击右键选择Removeaction即可。
下面简述一下布局管理器。
(这里主要以垂直布局管理器进行讲解,其他类型管理器用法与之相同,其效果可自己验证。
)
1.在左边的器件栏里拖入三个PushButton和一个VerticalLayout(垂直布局管理器)到中心面板。
如下图。
2.将这三个按钮放入垂直布局管理器,效果如下。
可以看到按钮垂直方向排列,并且宽度可以改变,但高度没有改变。
3.我们将布局管理器整体选中,按下上面工具栏的BreakLayout按钮,便可取消布局管理器。
(我们当然也可以先将按钮移出,再按下Delete键将布局管理器删除。
)
4.下面我们改用分裂器部件(QSplitter)。
先将三个按钮同时选中,再按下上面工具栏的LayOutVerticallyinSplitter(垂直分裂器)。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Qt