QT编程入门.pdf

上传人:tbuqq 文档编号:4633673 上传时间:2019-11-22 格式:PDF 页数:19 大小:188.84KB
返回 下载 相关 举报
QT编程入门.pdf_第1页
第1页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《QT编程入门.pdf》由会员分享,可在线阅读,更多相关《QT编程入门.pdf(19页珍藏版)》请在三一文库上搜索。

1、QT编程入门 看完这段Qt 入门介绍,还是什么都没看明白,只确定一点Qt 中所有类都是以Q 开头的, 而且 每个单词之间没有间隔,感觉与Symbian有完全不同的框架跟编程。 。 。 Qt 是一个跨平台的图形用户界面(GUI) 的集成开发工具。作为一篇初学者的入门学习指导, 这里我们将通过一个记事本的小程序来向大家介绍Qt 的一些基础知识。此后你可以参考我 们的技术概述和API 文档来进行开发。 Hello Notepad 在第一个例子中,我们创建了一个很简单的窗口,窗口中显示了“This is a QTextEdit ”,这可以说是一个最简单的拥有用户图形界面的Qt 程序了。 以下是代码:

2、#include #include intmain(intargv,char*args) QApplicationapp(argv, args); QTextEdittextEdit; textEdit.show(); returnapp.exec(); 1 2 3 4 5 6 7 8 9 10 11 12 #include #include intmain(intargv,char*args) QApplicationapp(argv, args); QTextEdittextEdit; textEdit.show(); returnapp.exec(); 现在让我们来对上面的代码逐行解释一

3、下,前两行是包含QApplication和 QTextEdit 类的头 文件,这两个类是我们程序中待会需要用到的。所有的Qt 类都一个以它们类名命名的头文 件。 第六行创建了一个QApplication对象,这个对象管理着整个程序的资源,它是运行一个拥 有用户图形界面的Qt 程序所必需的。 由于 Qt 接受一些命令行参数,在构造QApplication对象需要传递argv 和 args 两个参数。 第八行创建了一个QTextEdit 对象。 QTextEdit 对象是用户图形界面(GUI) 中一个可见元素。 在 Qt 中,我们叫这类可见元素为widget ,其他 widget 还有 滚动条 (

4、QScrollBar), 标签 (QLabel) ,以及单选框 (QRadioButton)等等。一个widget 也可以作为其他的widget 的 容器,也就是说可以包含其他widget ,例如一个对话框或是一个主程序窗口。 第九行是用来在窗口上显示QTextEdit对象。由于widget也可以作为容器,例如一个 QMainWindow实例就包含有工具条,菜单,状态栏等其他一些widget ,这时可以将其显示 在它自己的窗口中。默认情况下,widget 是不可见的,需要调用它的show() 方法才能让其 可见。 第十一行让QApplication对象进入它的事件循环中。当一个Qt 程序运行时

5、,事件被创建并 被传递给相应的widget ,比如鼠标按下的事件,键盘事件,都会被传递给对应的widget 。 当你在一个QTextEdit对象中输入文字时,它会接受键盘按下事件并显示相应的字符。 如果想运行程序,你需要打开命令窗口,进入到程序.cpp 文件所在的目录。键入以下命令 即可: qmake -project qmake make 1 2 3 qmake -project qmake make 以上命令会在part1 目录下生成可运行程序(注意在 windows 下, 你可能需要使用nmake 命 令而不是 make 命令,另外, 可运行的程序也将会被放在part1/debug目录或

6、是 part1/release 目录下 )。 qmake 是 Qt 的编译工具, 它需要一个 .qmake 的配置文件, 而当使用 -project 参数时就会生 成这个 .qmake 的文件。 qmake 会根据工程配置文件,即.pro 文件,来生成一个make 文件 以便编译程序。我们待会会进一步对.pro 文件做详细说明。 增加一个退出按钮 在真正的程序中, 通常来讲都需要一个以上的widget 。 这里我们将在QTextEdit 文字输入框 下面增加一个QPushButton按钮。当单击这个按钮时会退出这个记事本程序。 让我们先来看看代码部分: #include intmain(int

7、argv,char*args) QApplicationapp(argv, args); QTextEdittextEdit; QPushButtonquitButton(“Quit“); QObject:connect( QVBoxLayoutlayout; layout.addWidget( layout.addWidget( QWidgetwindow; window.setLayout( window.show(); returnapp.exec(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include i

8、ntmain(intargv,char*args) QApplicationapp(argv, args); QTextEdittextEdit; QPushButtonquitButton(“Quit“); QObject:connect( QVBoxLayoutlayout; layout.addWidget( layout.addWidget( QWidgetwindow; window.setLayout( window.show(); returnapp.exec(); 第一行包含了QtGui , QtGui 包括了所有Qt 的用户界面接口类。 第十行使用Qt 中的信号槽机制使得当退

9、出按钮被按下时可以退出程序。槽是一个函数,在 程序运行过程中, 它可以像普通函数一样调用。信号是一个函数,当被调用时即触发连接到此信号的所有槽, 对此我们称之为连接槽到信号,发送信号。 quit() 是一个 QApplication类的一个槽, 用来退出程序。 click() 是 QPushButton的一个信号, 当它被按下是即会发送一个click() 信号。静态方法QObject:connect()用来连接信号和槽。 SIGNAL 和 SLOT 是两个宏, 宏的参数是相应信号和槽的函数签名。另外在连接信号槽时我 们也需要指定发送信号和接受信号的对象指针。 第十二行创建了一个QVBoxLay

10、out对象, 如上所述, widget 可以包含其他widget ,也可以 直接设置它的子对象的的边界(位置以及大小),但一般来讲,使用布局类来管理这种位置 关系会更方便,QVBoxLayout就是这样一个布局类,它可以将其子对象在竖直方向上进行 排列。 第十三和第十四行将文字输入框和按钮加入布局对象中。第十七行我们将这个布局对象设置 为这个 widget 的布局。 继承 QWidget 当用户想退出程序时,你可能会想弹出一个对话框以便询问是否真的要退出。在下面这个例 子中,我们继承自QWidget ,增加一个连接到退出按钮的槽。 让我们来看看实现代码: classNotepad :publi

11、cQWidget Q_OBJECT public: Notepad(); privateslots: voidquit(); private: QTextEdit*textEdit; QPushButton*quitButton; ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 classNotepad :publicQWidget Q_OBJECT public: Notepad(); privateslots: voidquit(); private: QTextEdit*textEdit; QPushButton*quitButton; ; Q_OBJECT宏必须放

12、在类声明的最前面,它声明我们的类是一个QObject 类(实际上,我 们必须继承自QObject ) 。QObject 在 C+ 类基础上扩展很多能力,其中很重要的是可以在 程序运行时查询类名和槽名,也可以查询一个槽的参数,然后调用它。 第十三行声明了一个quit() 槽。使用slots 宏很简单。 quit() 槽可以被连接到对应签名的信号 (任何没有参数的信号都可以)。 与设计 GUI 然后在 main() 函数中连接槽所不同, 这次我们在NotePad 的构造函数中做这些: Notepad:Notepad() textEdit =newQTextEdit; quitButton =new

13、QPushButton(tr(“Quit“); connect(quitButton, SIGNAL(clicked(),this, SLOT(quit(); QVBoxLayout*layout =newQVBoxLayout; layout-addWidget(textEdit); layout-addWidget(quitButton); setLayout(layout); setWindowTitle(tr(“Notepad“); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Notepad:Notepad() textEdit =newQTextEdit;

14、 quitButton =newQPushButton(tr(“Quit“); connect(quitButton, SIGNAL(clicked(),this, SLOT(quit(); QVBoxLayout*layout =newQVBoxLayout; layout-addWidget(textEdit); layout-addWidget(quitButton); setLayout(layout); setWindowTitle(tr(“Notepad“); 正 如 在 类 声 明 中 看 到 的 那 样 , 我 们 使 用 指 针 指 向 我 们 的QObject对 象 (te

15、xtEdit和 quitButton) 。记住,你应该总是堆上构造 QObject 对象,绝不要去拷贝它们。我们使用tr()函数处理用户可见的字符串。如果你需要 支持多语言 (例如英语和中文),那么这个函数是必需的,对此这里我们不做展开,但 你可以通过下面的Qt Linguist连接来了解更多。 创建一个 .pro 文件 这里我们没有使用qmake 的-project 选项,而是自己写了一个.pro 文件。 HEADERS = notepad.h SOURCES = notepad.cpp main.cpp 1 2 3 HEADERS = notepad.h SOURCES = notepad

16、.cpp main.cpp 下面的命令将会编译我们的例子。 qmake make 使用 QMainWindow 很多程序都使用QMainWindow ,这样很方便因为QMainWindow拥有自己的布局,你可以 加入菜单工具栏,浮动的widget ,工具条,状态栏。QMainWindow有一个中心区域,这个 中心区域可以被任何一个widget 占用,这里我们把我们的文字编辑框放在这个中心区域。 让我们来看看Notepad 类的声明: #include classNotepad :publicQMainWindow Q_OBJECT public: Notepad(); privateslots

17、: voidopen(); voidsave(); voidquit(); private: QTextEdit*textEdit; QAction*openAction; QAction*saveAction; QAction*exitAction; QMenu*fileMenu; ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include classNotepad :publicQMainWindow Q_OBJECT public: Notepad(); privateslots: voidopen();

18、voidsave(); voidquit(); private: QTextEdit*textEdit; QAction*openAction; QAction*saveAction; QAction*exitAction; QMenu*fileMenu; ; 我们增加了两个槽以便来保存和打开文档,我们会在下面实现这两个槽。 在一个主窗口中,同一个槽会经常被多个widget 调用,如菜单项,工具条上的按钮。为了 更方便, Qt 中提供了QAction ,它可以被连接到某个槽上,并加入到一些widget 中。例如 QMenu 和 QToolBar 都可以使用QAction 创建菜单项以及工具按钮

19、.我们将在下面对此做进 一步说明。如上所述,我们使用Notepad 的构造函数来配置用户图形接口: Notepad:Notepad() saveAction =newQAction(tr(“ saveAction =newQAction(tr(“ exitAction =newQAction(tr(“E connect(openAction, SIGNAL(triggered(),this, SLOT(open(); connect(saveAction, SIGNAL(triggered(),this, SLOT(save(); connect(exitAction, SIGNAL(trig

20、gered(), qApp, SLOT(quit(); fileMenu = menuBar()-addMenu(tr(“ fileMenu-addAction(openAction); fileMenu-addAction(saveAction); fileMenu-addSeparator(); fileMenu-addAction(exitAction); textEdit =newQTextEdit; setCentralWidget(textEdit); setWindowTitle(tr(“Notepad“); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

21、 16 17 18 19 20 21 Notepad:Notepad() saveAction =newQAction(tr(“ saveAction =newQAction(tr(“ exitAction =newQAction(tr(“E connect(openAction, SIGNAL(triggered(),this, SLOT(open(); connect(saveAction, SIGNAL(triggered(),this, SLOT(save(); connect(exitAction, SIGNAL(triggered(), qApp, SLOT(quit(); fil

22、eMenu = menuBar()-addMenu(tr(“ fileMenu-addAction(openAction); fileMenu-addAction(saveAction); fileMenu-addSeparator(); fileMenu-addAction(exitAction); textEdit =newQTextEdit; setCentralWidget(textEdit); setWindowTitle(tr(“Notepad“); QAction可以使用文字来构造,这些文字会显示在拥有这些QAction对象的 widget 上(在 这个例子中是菜单项) 。如果我

23、们将QAction 加入一个工具条,我们还可以给它们增加一些 小图标。 保存和加载 在这个例子中,我们将实现上面例子中所增加的open() 槽和 save() 槽的具体功能。 先开始 open() 槽: QStringfileName =QFileDialog:getOpenFileName(this, tr(“Open File“),“, tr(“Text Files (*.txt);C+ Files (*.cpp *.h)“); if(fileName !=“) QFilefile(fileName); if(!file.open(QIODevice:ReadOnly) QMessageB

24、ox:critical(this, tr(“Error“), tr(“Could not open file“); return; QStringcontents = file.readAll().constData(); textEdit-setPlainText(contents); file.close(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 QStringfileName =QFileDialog:getOpenFileName(this, tr(“Open File“),“, tr(“Text Files (*.txt);C+ Files (*.cpp

25、 *.h)“); if(fileName !=“) QFilefile(fileName); if(!file.open(QIODevice:ReadOnly) QMessageBox:critical(this, tr(“Error“), tr(“Could not open file“); return; QStringcontents = file.readAll().constData(); textEdit-setPlainText(contents); file.close(); 第一步是询问用户打开的文件名。Qt 中使用 QFileDialog来弹出一个对话框来让用户选择文 件。

26、上图显示了在Kubuntu平台上的文件选择对话框。静态的getOpenFileName()函数显 示一个模态的文件选择对话框,直到用户选择了某个文件才会返回,它会返回用户选择文件 所在的路径,如果用户取消则返回空字符串。 如果我们有一个文件名,可以使用open() 方法来尝试打开文件,如果文件可以被打开则返 回 true 。这里我们不对其中的错误处理做说明,但你可以通过以下learn more 部分来了解更多。如果文件不能打开,我们会使用QMessageBox来显示一个错误信 息的对话框 (请参考 QMessageBox类的说明以便了解更多)。 实际上使用readAll() 函数来读取数据是微

27、不足道的,她会返回一个QByteArray ,这个 QByteArray包含了文件中所有的数据。constData() 方法返回包含所有的数据的一个常数组。 这些内容都可以用一个文字编辑框来显示。然后我们可以用close() 方法来关闭打开的文件 来返回打开的系统中。 现在让我们来继续save() 槽部分: QStringfileName =QFileDialog:getSaveFileName(this, tr(“Save File“),“, tr(“Text Files (*.txt);C+ Files (*.cpp *.h)“); if(fileName !=“) QFilefile(f

28、ileName); if(!file.open(QIODevice:WriteOnly) / error message else QTextStreamstream( stream toPlainText(); stream.flush(); file.close(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 QStringfileName =QFileDialog:getSaveFileName(this, tr(“Save File“),“, tr(“Text Files (*.txt);C+ Files (*.cpp *.h)“); if(fileName !=“) QFilefile(fileName); if(!file.open(QIODevice:WriteOnly) / error message else QTextStreamstream( stream toPlainText(); stream.flush(); file.close(); 当我们将一个文字编辑框中的内容写到一个文件时,我们使用QTextStream类,这个类包 含了一个QFile 对象。QTextStream 类可以直接将QString 类的字符内容写到文件中。QFile 只接受 QIODevice类的 write() 方法的 char* 的原始数据。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1