《QT编程入门.pdf》由会员分享,可在线阅读,更多相关《QT编程入门.pdf(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、QT 编程入门看完这段 Qt 入门介绍,还是什么都没看明白,只确定一点Qt 中所有类都是以 Q 开头的,而且每个单词之间没有间隔,感觉与 Symbian 有完全不同的框架跟编程。Qt 是一个跨平台的图形用户界面(GUI)的集成开发工具。作为一篇初学者的入门学习指导,这里我们将通过一个记事本的小程序来向大家介绍Qt 的一些基础知识。此后你可以参考我们的技术概述和 API 文档来进行开发。Hello Notepad在第一个例子中,我们创建了一个很简单的窗口,窗口中显示了“This is aQTextEdit”,这可以说是一个最简单的拥有用户图形界面的Qt 程序了。以下是代码:#include#in
2、cludeintmain(intargv,char*args)QApplicationapp(argv,args);QTextEdittextEdit;textEdit.show();returnapp.exec();123456789101112#include#includeintmain(intargv,char*args)QApplicationapp(argv,args);QTextEdittextEdit;textEdit.show();returnapp.exec();现在让我们来对上面的代码逐行解释一下,前两行是包含 QApplication 和 QTextEdit类的头文件,
3、这两个类是我们程序中待会需要用到的。所有的Qt 类都一个以它们类名命名的头文件。第六行创建了一个 QApplication 对象,这个对象管理着整个程序的资源,它是运行一个拥有用户图形界面的 Qt 程序所必需的。由于 Qt 接受一些命令行参数,在构造QApplication 对象需要传递 argv 和 args 两个参数。第八行创建了一个 QTextEdit 对象。QTextEdit 对象是用户图形界面(GUI)中一个可见元素。在 Qt 中,我们叫这类可见元素为widget,其他 widget 还有滚动条(QScrollBar),标签(QLabel),以及单选框(QRadioButton)等等
4、。一个widget 也可以作为其他的 widget 的容器,也就是说可以包含其他widget,例如一个对话框或是一个主程序窗口。第九行是用来在窗口上显示QTextEdit 对象。由于 widget 也可以作为容器,例如一个QMainWindow 实例就包含有工具条,菜单,状态栏等其他一些 widget,这时可以将其显示在它自己的窗口中。默认情况下,widget 是不可见的,需要调用它的 show()方法才能让其可见。第十一行让 QApplication 对象进入它的事件循环中。当一个Qt 程序运行时,事件被创建并被传递给相应的 widget,比如鼠标按下的事件,键盘事件,都会被传递给对应的 w
5、idget。当你在一个 QTextEdit对象中输入文字时,它会接受键盘按下事件并显示相应的字符。如果想运行程序,你需要打开命令窗口,进入到程序.cpp 文件所在的目录。键入以下命令即可:qmake-projectqmakemake123qmake-projectqmakemake以上命令会在 part1目录下生成可运行程序(注意在 windows 下,你可能需要使用 nmake 命令而不是make命令,另外,可运行的程序也将会被放在part1/debug目录或是part1/release目录下)。qmake 是 Qt 的编译工具,它需要一个.qmake 的配置文件,而当使用-project
6、参数时就会生成这个.qmake 的文件。qmake 会根据工程配置文件,即.pro 文件,来生成一个make 文件以便编译程序。我们待会会进一步对.pro 文件做详细说明。增加一个退出按钮在真正的程序中,通常来讲都需要一个以上的widget。这里我们将在 QTextEdit 文字输入框下面增加一个 QPushButton 按钮。当单击这个按钮时会退出这个记事本程序。让我们先来看看代码部分:#includeintmain(intargv,char*args)QApplicationapp(argv,args);QTextEdittextEdit;QPushButtonquitButton(Qui
7、t);QObject:connect(&quitButton,SIGNAL(clicked(),qApp,SLOT(quit();QVBoxLayoutlayout;layout.addWidget(&textEdit);layout.addWidget(&quitButton);QWidgetwindow;window.setLayout(&layout);window.show();returnapp.exec();12345678910111213141516171819202122#includeintmain(intargv,char*args)QApplicationapp(arg
8、v,args);QTextEdittextEdit;QPushButtonquitButton(Quit);QObject:connect(&quitButton,SIGNAL(clicked(),qApp,SLOT(quit();QVBoxLayoutlayout;layout.addWidget(&textEdit);layout.addWidget(&quitButton);QWidgetwindow;window.setLayout(&layout);window.show();returnapp.exec();第一行包含了 QtGui,QtGui 包括了所有 Qt 的用户界面接口类。
9、第十行使用 Qt 中的信号槽机制使得当退出按钮被按下时可以退出程序。槽是一个函数,在程序运行过程中,它可以像普通函数一样调用。信号是一个函数,当被调用时即触发连接到此信号的所有槽,对此我们称之为连接槽到信号,发送信号。quit()是一个 QApplication 类的一个槽,用来退出程序。click()是 QPushButton 的一个信号,当它被按下是即会发送一个 click()信号。静态方法 QObject:connect()用来连接信号和槽。SIGNAL 和 SLOT 是两个宏,宏的参数是相应信号和槽的函数签名。另外在连接信号槽时我们也需要指定发送信号和接受信号的对象指针。第十二行创建了
10、一个 QVBoxLayout 对象,如上所述,widget 可以包含其他 widget,也可以直接设置它的子对象的的边界(位置以及大小),但一般来讲,使用布局类来管理这种位置关系会更方便,QVBoxLayout 就是这样一个布局类,它可以将其子对象在竖直方向上进行排列。第十三和第十四行将文字输入框和按钮加入布局对象中。第十七行我们将这个布局对象设置为这个 widget 的布局。继承 QWidget当用户想退出程序时,你可能会想弹出一个对话框以便询问是否真的要退出。在下面这个例子中,我们继承自 QWidget,增加一个连接到退出按钮的槽。让我们来看看实现代码:classNotepad:publi
11、cQWidgetQ_OBJECTpublic:Notepad();privateslots:voidquit();private:QTextEdit*textEdit;QPushButton*quitButton;1234567891011121314classNotepad:publicQWidgetQ_OBJECTpublic:Notepad();privateslots:voidquit();private:QTextEdit*textEdit;QPushButton*quitButton;Q_OBJECT 宏必须放在类声明的最前面,它声明我们的类是一个QObject 类(实际上,我们必
12、须继承自 QObject)。QObject 在 C+类基础上扩展很多能力,其中很重要的是可以在程序运行时查询类名和槽名,也可以查询一个槽的参数,然后调用它。第十三行声明了一个 quit()槽。使用 slots 宏很简单。quit()槽可以被连接到对应签名的信号(任何没有参数的信号都可以)。与设计 GUI然后在main()函数中连接槽所不同,这次我们在NotePad的构造函数中做这些:Notepad:Notepad()textEdit=newQTextEdit;quitButton=newQPushButton(tr(Quit);connect(quitButton,SIGNAL(clicked
13、(),this,SLOT(quit();QVBoxLayout*layout=newQVBoxLayout;layout-addWidget(textEdit);layout-addWidget(quitButton);setLayout(layout);setWindowTitle(tr(Notepad);123456789101112131415Notepad:Notepad()textEdit=newQTextEdit;quitButton=newQPushButton(tr(Quit);connect(quitButton,SIGNAL(clicked(),this,SLOT(quit
14、();QVBoxLayout*layout=newQVBoxLayout;layout-addWidget(textEdit);layout-addWidget(quitButton);setLayout(layout);setWindowTitle(tr(Notepad);正如在类声明中看到的那样,我们使用指针指向我们的 QObject 对象(textEdit 和quitButton)。记住,你应该总是堆上构造QObject 对象,绝不要去拷贝它们。我们使用 tr()函数处理用户可见的字符串。如果你需要支持多语言(例如英语和中文),那么这个函数是必需的,对此这里我们不做展开,但你可以通过下面
15、的 Qt Linguist 连接来了解更多。创建一个.pro 文件这里我们没有使用 qmake 的-project 选项,而是自己写了一个.pro 文件。HEADERS=notepad.hSOURCES=notepad.cppmain.cpp123HEADERS=notepad.hSOURCES=notepad.cppmain.cpp下面的命令将会编译我们的例子。qmakemake使用 QMainWindow很多程序都使用 QMainWindow,这样很方便因为QMainWindow 拥有自己的布局,你可以加入菜单工具栏,浮动的widget,工具条,状态栏。QMainWindow 有一个中心区
16、域,这个中心区域可以被任何一个widget 占用,这里我们把我们的文字编辑框放在这个中心区域。让我们来看看 Notepad 类的声明:#includeclassNotepad:publicQMainWindowQ_OBJECTpublic:Notepad();privateslots:voidopen();voidsave();voidquit();private:QTextEdit*textEdit;QAction*openAction;QAction*saveAction;QAction*exitAction;QMenu*fileMenu;1234567891011121314151617
17、181920212223#includeclassNotepad:publicQMainWindowQ_OBJECTpublic:Notepad();privateslots:voidopen();voidsave();voidquit();private:QTextEdit*textEdit;QAction*openAction;QAction*saveAction;QAction*exitAction;QMenu*fileMenu;我们增加了两个槽以便来保存和打开文档,我们会在下面实现这两个槽。在一个主窗口中,同一个槽会经常被多个 widget 调用,如菜单项,工具条上的按钮。为了更方便,
18、Qt 中提供了 QAction,它可以被连接到某个槽上,并加入到一些widget 中。例如QMenu 和 QToolBar 都可以使用 QAction 创建菜单项以及工具按钮.我们将在下面对此做进一步说明。如上所述,我们使用Notepad 的构造函数来配置用户图形接口:Notepad:Notepad()saveAction=newQAction(tr(&Open),this);saveAction=newQAction(tr(&Save),this);exitAction=newQAction(tr(E&xit),this);connect(openAction,SIGNAL(triggere
19、d(),this,SLOT(open();connect(saveAction,SIGNAL(triggered(),this,SLOT(save();connect(exitAction,SIGNAL(triggered(),qApp,SLOT(quit();fileMenu=menuBar()-addMenu(tr(&File);fileMenu-addAction(openAction);fileMenu-addAction(saveAction);fileMenu-addSeparator();fileMenu-addAction(exitAction);textEdit=newQTe
20、xtEdit;setCentralWidget(textEdit);setWindowTitle(tr(Notepad);123456789101112131415161718192021Notepad:Notepad()saveAction=newQAction(tr(&Open),this);saveAction=newQAction(tr(&Save),this);exitAction=newQAction(tr(E&xit),this);connect(openAction,SIGNAL(triggered(),this,SLOT(open();connect(saveAction,S
21、IGNAL(triggered(),this,SLOT(save();connect(exitAction,SIGNAL(triggered(),qApp,SLOT(quit();fileMenu=menuBar()-addMenu(tr(&File);fileMenu-addAction(openAction);fileMenu-addAction(saveAction);fileMenu-addSeparator();fileMenu-addAction(exitAction);textEdit=newQTextEdit;setCentralWidget(textEdit);setWind
22、owTitle(tr(Notepad);QAction 可以使用文字来构造,这些文字会显示在拥有这些QAction 对象的 widget 上(在这个例子中是菜单项)。如果我们将 QAction 加入一个工具条,我们还可以给它们增加一些小图标。保存和加载在这个例子中,我们将实现上面例子中所增加的open()槽和 save()槽的具体功能。先开始 open()槽:QStringfileName=QFileDialog:getOpenFileName(this,tr(Open File),tr(TextFiles(*.txt);C+Files(*.cpp*.h);if(fileName!=)QFil
23、efile(fileName);if(!file.open(QIODevice:ReadOnly)QMessageBox:critical(this,tr(Error),tr(Couldnot open file);return;QStringcontents=file.readAll().constData();textEdit-setPlainText(contents);file.close();1234567891011121314QStringfileName=QFileDialog:getOpenFileName(this,tr(Open File),tr(TextFiles(*.
24、txt);C+Files(*.cpp*.h);if(fileName!=)QFilefile(fileName);if(!file.open(QIODevice:ReadOnly)QMessageBox:critical(this,tr(Error),tr(Couldnot open file);return;QStringcontents=file.readAll().constData();textEdit-setPlainText(contents);file.close();第一步是询问用户打开的文件名。Qt 中使用 QFileDialog 来弹出一个对话框来让用户选择文件。上图显示了
25、在 Kubuntu 平台上的文件选择对话框。静态的 getOpenFileName()函数显示一个模态的文件选择对话框,直到用户选择了某个文件才会返回,它会返回用户选择文件所在的路径,如果用户取消则返回空字符串。如果我们有一个文件名,可以使用 open()方法来尝试打开文件,如果文件可以被打开则返回 true。这里我们不对其中的错误处理做说明,但你可以通过以下learnmore 部分来了解更多。如果文件不能打开,我们会使用QMessageBox 来显示一个错误信息的对话框(请参考 QMessageBox 类的说明以便了解更多)。实际上使用 readAll()函数来读取数据是微不足道的,她会返回
26、一个QByteArray,这个QByteArray包含了文件中所有的数据。constData()方法返回包含所有的数据的一个常数组。这些内容都可以用一个文字编辑框来显示。然后我们可以用 close()方法来关闭打开的文件来返回打开的系统中。现在让我们来继续 save()槽部分:QStringfileName=QFileDialog:getSaveFileName(this,tr(Save File),tr(TextFiles(*.txt);C+Files(*.cpp*.h);if(fileName!=)QFilefile(fileName);if(!file.open(QIODevice:Wr
27、iteOnly)/error messageelseQTextStreamstream(&file);streamtoPlainText();stream.flush();file.close();1234567891011121314QStringfileName=QFileDialog:getSaveFileName(this,tr(Save File),tr(TextFiles(*.txt);C+Files(*.cpp*.h);if(fileName!=)QFilefile(fileName);if(!file.open(QIODevice:WriteOnly)/error messageelseQTextStreamstream(&file);streamtoPlainText();stream.flush();file.close();当我们将一个文字编辑框中的内容写到一个文件时,我们使用 QTextStream类,这个类包含了一个 QFile 对象。QTextStream类可以直接将 QString类的字符内容写到文件中。QFile只接受 QIODevice 类的 write()方法的 char*的原始数据。