qt中文手册

所需积分/C币:5 2013-11-27 11:13:45 3.65MB PDF
收藏 收藏
举报

适合初学者学习的QT!
3 #include <Slider> 4 include <Qspin Box> 5 int main(int argc, char argyll 6{ 7 QApplication app(argc, argv) 8 QWidget *window new QWidget; 9 window->setWindow Title( Enter Your Age); 10 QSpin Box *spin Box= new QSpinBox 11 QSlider * slider new QSlider(Qt: Horizontal) 12 spin Box->setRange(0, 130); 13 slider->setRange(0, 130) 14 Qobject: connect(spin Box, SIGNAL(value Changed (int)), slider, SLoT(setvalue(int))) 16 Qobject: connect(slider, SIGNAL(value Changed (int)) 17 spin Box, SLoT(setvalue(int)); 18 spinBox->setValue(35) 19 QHBoxLayout *layout new QHBoxLayout 20 layout->addWidget(spin Box); 21 layout->addWidget(slider) 22 window->setLayout(layout) 23 window->show: 24 return app. execo; 25} 第8,9行建立程序的主窗口控件,设置标题。第10到13行创建主窗口的 children,并设置 允许值的范围。第14到第17行是 spin Box和 slider的连接,以使之同步显示同一个年龄值 不管那个控件的值发生变化,都会发出 value Changed(int)信号,另一个控件的 setvalue(int) 数貮会为这个控件设置一个新值 第18行将 spinBox的值设置为35,这时 spinBox发出 value Changed(int)信号,int的参 数值为35,这个参数传递给 slider的 setvalue(int)函数,将 slider的值也设置为35。同理, slider也会发出 value Changed(int)信号,触发 spinBoX的 setvalue(int)函数。这个时候, 因为 spinBox的当前值就是35,所以 spinOⅹ不会发送任何信号,不会引起死循环 在第19至22行,我们使用了一个布局管理器排列 spinoⅹ和 slider控件。布局管理器能够 根据需要确定控件的大小和位置。Qt有三个主要的布局管理器: QHBoXLayout:水平排列控件。 QVBOXLayout:乖直排列控件。 QGridlayout:按矩阵方式排刎控件 第22行, QWidget:! layout()把这个布局管理器放在 window上.。这个语句将 spinBox 和 slider的ν父"设为 window,即布局管理器所在的控件。如果一个控件由布局管理器确定它 的大小和位置,那个创建它的时候就不必指定一个明确的"父"控件, 现作,虽然我们还没有看见 spin Box和 slider控件的大小和位置,它们已经水平排列好了 QHBoXLayout能合理安排它们我们不用在程序中考虑控件在屏幕上的大小和位置这些头疼的 事情了,交给布局管理器就万事大吉。 在αt中健立用户界面就是这样简单灵活。程序员的任务就是实例化所需要的控件,按照需要设 置它们的属性,把它们放到布局管理器中。界面中要完成任务由Qt的 signal和slot完成 第二章创建对话框( Creating Dialogs) 在这章介绍如何创建qt的对话柱。对话框是程序和用户交互的桥梁,提供了程序和用户之间对 话的种方式。 很多程序都是由一个主窗口,在这个主窗口中包含一个菜单条,多个工具条,和足够多的对话框 也有些程序本身就是一个对话框,直接相应用户的输入请求。 木章中我们首先会用代码的方式创建我们的第一个对话框,然后用 Qt designer工具创建对话 框。 Qt Designer是一个可视化的T具,用它可以更快的创建,修改对话框, 2.1派生对话框类( Subclassing DIalog) 第一个例子是一个用C++实现的查找对话框。我们把这个对话框实现为一个类,这样它就是一 个独立的控件,并有自己的信号( signal)和sot函数 类的源代码分别放在 finddialog h和 finddialog. cpp中。首先看 finddialog. h的代码 1 #ifndef finddialog h 2 #define finddialog h 3 #include <QDialog> 4 class check Bo 5 class qLabel 6 class qlineedit: 7 class QPushButton 8 class FindDialog: public QDialog 10 Q OBJECT 11 publ 12 FindDialog qwidget parent =0; 13 signals 14 void findNext(const STring &str, Qt: Casesensitivity cS) 15 void findPrevious(const QString &str, Qt: CaseSensitivity cs) 16 private slots 17 void findclicked o: 18 void enableFind Button(const QString &text) 19 private 20 QLabe米abe; 21 QLineEdit * lineediti 22 CHeck Box*case Check Box 23 QCheck Box *backwardCheck Box 24 QPushButton *find Button; 25 QPushButton *close Button 26} 27 fendi 一共27行,第1,2,27行是为了避免头文件被多次包含。 第3行包含 DIalog头文件,这个类从 DIalog继承, DIalog从 QWidget继承 第4至7行是用到的Q中类的前向声明。通过前向声明,编译器就知道这个类已经存在,而不 用写出包含的头文件。这个问题稍后还要讲 第8至26行是类 FindDialog的定义 第10行, Q_OBJECT是一个宏定义,如果类里面用到了 signal或者sots,就要声明这个宏 鴒12行, FindDialog( QWidget* parent≡0);构造函数是αt控件类的标准格式,默认的 父参数为NULL,说明没有父控件。 第13行, signal声明了这个对话框发出的两个信号,如果选择向前查找,那么对话框就发出 find Previous(信号,否则,发岀 findNext()信号。 signal也是一个宏,在编译之前,C++预 处理把它变成标准的c++代码Qt:: Casesensitivity是一个枚举类型,有Qt: Casesensitive 和Qt: Caseinsensitive两个值 在类的私有部分,声明有两个so函数。为了实现这两个函数,需要用到对话框的其他控件的 信息,所以保存了一些控件的指针。slot关键字和sgna一样,也是一个宏 对于私有成员变量,我们只是使用了它们的指针,没有对它们进行存取操作,编译器不需要知道 它们的详细定义,所以只使用了这些类的前向声明。当然,也可以使用< CHeck Box>, < QLabe|>等,但是,使用前向声明会让编详速度史快一些 下亩看一下 finddialog. cpp源文件代码 文件头和构造函数部分 1 #include <QtGui> 2 #include finddialog h 3 FindDialog: Find Dialog(QWidget*parent 4:QDialog(parent { 6 label new QLabel(tr("Find &what: 7 line edit= new QLine edit 8 label->setBuddy (lineedit) 9 case Check Box= new QCheck Box(tr("Match &case); 10 backwardcheck Box new QCheck Box(tr("Search &backward"); find Button new QPush Button(("&Find")) 12 find Button->setDefault(true) 13 find Button-setEnabled (false); 14 close Button new QPushButton(tr(Close")) 15 connect(lineEdit, SIGNAL(text Changed(const QString &) this, SLoT (enableFind Button(const QString &)) 17 connect(find Button, SIGNAL(clicked) 18 this, SLoT (findClicked): connect(close Button SIGNAL(clicked) 20 this slot(close)) 21 QH BoXLayout *topLeftlayout new QHBoXLayou 22 topLeftLayout->addwidget(label) 23 topLeftLayout->addWidget(lineEdit); 24 QVBOXLayout *leftLayout new QVBoXLayout: 25 leftLayout->addLayout(topLeftLayout 26 leftLayout->addWidget(case Check Box) 27 leftLayout->addWidget (backward check Box) 28 QVBOXLayout *rightLayout new QVBoxLayout; 29 rightLayout->addWidget(find Button) 30 rightLayout->addWidget(close Button); 31 rightLayout->addstretch (? 32 QHBoX Layout main Layout new QHBoxLayout 3 mainLayout->addlayoutdleftlayouti 34 main ->addlayout(rightLayout) 35 setLayout(mainLayout; 36 setWindow Titletr("Find")); 37 setFixedHeight(sizeHint( height(); 38} 到这里 FindDialog的构造函数就完成了。在传见控作和布局时我们使用了new,一般情况下, 我们还需要写析构函数 delete这些控件 但是在t中这是不需要的,当父控件销毀时,Qt自动删除它所有的子控件和布局。 下亩是 FindDialog类的两个slot函数 39 void Find Dialog: findClickedo 40{ 41 QString text lineEdit->texto 42 Qt: Case Sensitivity CS 43 case Check Box->isChecked (? Qt: CaseSensitive 44 Qt: CaseInsensitive: 45 if (backward check Box->ischeckedoi 46 emit find Previous(text, cs) 47 ]else i 48 emit findNext(text, cS: 49} 50} 51 void Find Dialog: enableFind Button(const QString &text) 52 53 find Button->setEnabled(text isEmpty o) 54} 当用户点击 findButton按钮, find Clicked()就会调用,根据 backward checkBoⅹ状态,他 发出 find Previous(或者 findNext()信号。emt也是一个Qt的宏。 当用户改变 lineedit中的文本, enable find Button()sot函数就会凋用。如果输入了文本,那 么让 find Button有效,否则就无效 最后,创建 maIn. cpp测试 FindDialog对话框。 1 #include <QApplication> 2 #include"finddialog. h 3 int main (int argc, char * argylL) 5 QApplication app (argc argv) 6 Find Dialog *dialog new FindDialog 7 dialog->show(; 8 return app. execo 9 运行 qmake编译程序。由于在 Find Dialog中包含了 Q OBJECT宏,由 qmake生成的 makefile会休换特殊的规则运行moc(Qt的原对象编译器)。 为了确保moC正确工作,类定乂必须敚在头文件而不能放在实现文件中。由moc生成的代码 中包含这个头文件,并加入它自凵实现的C++代码。 使用了 Q_OBJECT宏的类必须运行moc。如果使用 qmake,那么 makefile里自动包含相关 的规则。如果忘记了运行moC,就会发生连接错误。不同的编译器给出的提示信息不同,有的 会非常晦涩。GCC给出的错误信息如下: finddialog. o: In function ' Dialog: tr(char const*, char const*) /usr/lib/at/src/corelib/global/qglobal h: 1430: undefined reference to Find Dialog: staticMetaObject Visual o++中的输出是这样: finddialog. obj: error LNk2001: unresolved external symbol public: virtual int thiscall My Class: gt_metacall(enum QMetaobject : Call. int,void米*)" 这时需要重新运行 qmake,更新 makefile,然后编译程序 运行程序,如果看到了快键,测试ALT+W,ALT+CALT+B,ALT+F引发相应的处理程序。使 用TAB键在将焦点改变到不同的控件上。默认的TAB键是控件创建的顺序。 QWidget: settaborder(可以改变这个顺序。 提供合适的tab顺序和快键可以让用户不用鼠标也可以运行程序,通过键盘可以快速控制程序 22深入信号和槽( Signals and slots in Depth) 信号和槽是Qt编程的一个重要部分。这个机制可以在对象之间彼此并不了解的情况下将它们的 行为联系起米。在前几个例程中,我们已经连接了信号和槽,声明了控件自己的信号和槽,并实 现∫槽函数,发送了信号。现在来史深入∫解这个机制 槽和普通的C++成员函数很像。它们可以是虚函数( virtual),也可被重载( overload),可 以是公有的(publ,保护的( protective),也可是私有的( private),它们可以象任何c+ 成员函数一样被调用,可以传递任何类型的参数。不同在于一个槽函数能和一个信号相连接,只 要信号发出了,这个槽函数就会自动被调用。 connect函数语法如下 connect(sender, SIGNAL(signal), receiver, SLOT(slot)) sendel和 receiver是 Qobject对象指针, signa和Slot是不带参数的函数原型。 SIGNALE() 和SLOT(宏的作用是把他们转换成字符串。 在目前有的例子中,我们已经迕接了不同的信号和槽。实际使用中还要考虑如下一些规则: 1、一个信号可以连接到多个槽: connect(slider, SIGNAL(value Changed(int)), spinBox, sLot(setvalue(int)) connect(slider, SIGNAL(value Changed(int)), this, SLoT(update StatusBarIndicator (int)); 当信号发出后,槽函数都会被调用,但是调用的顺序是随机的,不确定的。 2、多个信号可以连接到一个槽 connect(Idd, SIGNAL(overflow o), this, SLoT (handleMathErrorO)) connect(calculator, signal(division By zero),this, SLoT(handle Math Error)) 任何一个信号发出,槽函数都会执行 3、一个信号可以和另一个信号相连 connect(lineEdit, SIGNAL(textChanged (const Qstring &) this sIGNAl(updateRecord(const AString &)) 第一个信号发出后,第个信号也同时发送。除此之外,信号与信号连接上和信号和槽连接相 4、连接可以被删除 disconnect(lcd, SIGNAL(overflow), this, SLOT(handle MathErroro)) 这个函数很少使用,一个对象删除后,Qt自动删除这个对象的所有连接。 信号和槽函数必须有着相同的参数类型,这样信号和槽函数才能成功连接: connect(ftp sIGNAL(raw Command Reply(int, const QString &)) this, SLOT(processReply (int, const QString &)) 如果信号里的参数个数多于槽函数的参数,多余的参数被忽略: connect(ftp, SIGNAL(raw CommandReply (int, const QString &)) this, SLoT(Check ErrorCode (int)); 如果参速类型不匹配,或者信号和槽不存在,在 debug状态吋,Qt会在运行期间给出警告。如 果信号和槽迕接时包含了参数的名字,Q将会给出警告。 以前我们列举的例子中都是控件的信号和槽。但是信号和槽机制在 Qobject中就实现了,可以 实现在任何从 Qobjec继承的子类中。 class Employee: public Qobject Q OBJECT publIC Employee(i mysalary =0;1 nt salary o consti return mysalary ;y public slots void set salary(int new Salary); signals void salary Changed(int newSalary) private int my salary i void Employee: setsalary(int new Salary) if(new Salary! mysalary)t mysalary newsalary: emit salaryChanged (mysalary; 注意,只有 new Salary!= mysalaryγ时才发出 salary- Changed()信号,这样避免了死循环 的出现。 Qt的Meta- Object系统 t旳一个最主要的成功是对C++扩展,即把彼此独立的软件模块连接起来,而不需要模块间的 任何细节。 这个机制就是Meta- Object系统,它提供∫两个关键的用途:信号和槽和 introspection(内 省)。 introspection功能允许应用程序在运行时得到 Qobjec它子类的meta- nformation" 这对实现信号和槽是很必要的,包括全部信号和槽的刎表,和类的名字。这个机制还提供了属性 (在 Qt Designer中使用)和文本翻译(国际化)支持。它们构成了QSA( Qt Script for App| cation)的基础。 标准C十十不提供 Qt meta-object系统需要的动态 meta-information Qt提供了一个独立 的工具moc,通过定义QOB]ECT宏实现到C++函数的转变。moc是用纯C++实现的,因 此可以使用在任何C++编译器中 这个机制工作过程如下 Q_OBJECT声明了一些 Qobject子类必须实现的内省函数: metaobject(),TR(, gt_metaca)等 Qt的moc工具实现 Q_OBJECT宏声明的函数和所有的信号 Qobject成员函数 connect()和 disconnect()使用这些内省函数实现信号和槽的连接。 以上这些是通过 qmake,moc和 QObject自动处理的,程序员通常不用考虑它们。如果你感 到对此好奇,可以查看 MEtaobject类文档和moc实现的c++代码。 23快速设计对话框( Rapid Dial。 g Design) 通常程序员们都是用c++源代码编写Qt应用程序,qt也是很容易用来编写的。然而,许多程 序员更喜欢用可视化的方法设计对话框,这样能更快速更容易对对话框进行修改。 Qt Designer涛足了程序员的这一要求,提供了可视化设计对话框的方法。它可以给一个应用 程序提供全部或者部分对话框。用 Qt Designer设计的对话框和用c++代码写成的对话框是一 样的,可以用做一个常用的工具,并不对编辑桊产生影响 在这一节中,我们使用 Qt Designer创建Go-to-ce对话框,无论用编写代码的方式还是用Qt Designer,创建对话框都有如卜基本的步骤: 1、创建和初始化子控件。 2、把子控件放到布局管理器中。 3、设置tab顺序 4、创建信号和槽。 5、实现对话框的自己的槽函数 在 windows平台Qt的安装目录的bin目录下,点击 desinger. exe,或者在unx平台,在命 令行上输入 designer当 Qt Designer启动后,它会列出一个控件模板的列表,选择一个模板, 进入设计 米米水米水米米米米米米米米水米米米水米米米水米米 原文中对 Qt Designer的介绍略去不想翻译了,只要稍有点界面編程基础的都可以轻松使用 如果确实需要,以后再补上。 我个人不喜欢使用这个东东,因为要多一个文件要维护,当然如果要频繁修改所设计的对话框, 那这种方法还是很方便的。但不管怎么样,最终都要修改源代码。所以我还是比较喜欢用源代码 的方式把控件手工写出来。 我想主要介绍把对话框设计好以后,保存为ui文件后的处理。 米半水*米来米水米来米水*米来米水米米来半水米半米 假如设计好的文件保存在 gotocell F录中,命名为 gotocelldialog ui中,然后在同一个日录 下创建个main.cpp文件,编码如卜 #include <APplication> #include <QDialog #include ui gotocelldialog. h int main(int argc, char *argv]) QApplication app(argc, argv) Ui: Go ToCell dialog ui QDialog *dialog new QDialog; ui. setupUi(dialog); dialog->show O: return app. exec) 保存后,在该目录下运行 qmake,创建.pro文件,然后运行 qmake- projec生成 makefile 文件。 qmake可以发现 gotocelldialog ui文件,然后就会调用uic(Qt的用户界面编译器), uicL具把 gotocelldialog ui转换成C十+代码,保存在 ui gotocelldialog h中。 在 ui_gotocelldialog h中,包含了Ui: GoToCell Dialog类的定义,这个类和 gotocelldialog ui等价。这个类声明成员变量存储对话框的子控件和布局管理器, setup(

...展开详情
试读 127P qt中文手册
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    抢沙发
    一个资源只可评论一次,评论内容不能少于5个字
    img
    随风庭

    关注 私信 TA的资源

    上传资源赚积分,得勋章
    最新推荐
    qt中文手册 5积分/C币 立即下载
    1/127
    qt中文手册第1页
    qt中文手册第2页
    qt中文手册第3页
    qt中文手册第4页
    qt中文手册第5页
    qt中文手册第6页
    qt中文手册第7页
    qt中文手册第8页
    qt中文手册第9页
    qt中文手册第10页
    qt中文手册第11页
    qt中文手册第12页
    qt中文手册第13页
    qt中文手册第14页
    qt中文手册第15页
    qt中文手册第16页
    qt中文手册第17页
    qt中文手册第18页
    qt中文手册第19页
    qt中文手册第20页

    试读已结束,剩余107页未读...

    5积分/C币 立即下载 >