2024年5月28日发(作者:)

C++ GUI Qt4安装

Qt 是一个跨平台应用程序和 UI 开发的框架。使用 Qt 您只需一次性开发应用程

序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。Qt4是其

最新版本。

功能

* 直观的 C++ 类库

* 跨桌面和嵌入式操作系统的移植性

* 具有跨平台 IDE 的集成开发工具

* 在嵌入式系统上的高运行时间性能,占用资源少

纪事概览:

* 1996年Qt 上市

* Qt 已成为数以万计商业和开源应用程序的基础

* Qt 的软件授权机制具有经受市场检验的双重授权(开源与商业)模式

* Qt Software 的前身为 Trolltech(奇趣科技)。 Trolltech (奇趣科技)始创

于1994年

* Trolltech (奇趣科技)于2008年6月被 Nokia 收购,加速了其跨平台开发战略

安装:

可以从官方网站下载安装:/downloads-cn,到这里下载

Qt SDK for 适合自己的操作系统平台的软件安装即可。

另外,Ubuntu用户可以用“添加删除程序”菜单来安装,不过,对于这样的用户,要

求先安装g++编译环境,安装的办法是使用命令:sudo apt-get install g++。

然后在“添加删除程序”中选择“编程”,再选择“Qt 4 Linguist、Qt 4 设计器、Qt

Creator、Qt4助手”安装即可。

开发第一个Qt程序--Hello Qt

安装好Qt之后,打开终端:Ubuntu下的终端在“应用程序-->附件-->终端”,windows

下如果还没有设置path环境变量,就直接从:

"开始-->程序-->Qt SDK by Nokia-->Qt command prompt"进入终端。然后使用如下

的命令创建目录和文件,然后编译运行,括号中注释是针对不同的平台:

1. 进入用户目录

cd ~ (ubuntu)

d: (windows)

2. 创建目录并进入

mkdir hello

cd hello

3.创建文件:

gedit (ubuntu)

notepad (windows)

在打开的文件中键入如下内容:

#include

#include

int main(int argc,char *argv[])

{

QApplication app(argc,argv);

QLabel *label=new QLabel("Hello Qt !",0);

label->show();

return ();

}

保存并关闭文件。

4. qmake -project (这一步是创建文件)

5. qmake (这一步创建Makefile文件)

6. make (这一步是编译出执行文件出来)

7. 运行程序,看效果

. / hello (ubuntu,ubuntu的执行文件在当前目录下)

./debug/hello (windows,windows的执行文件在debug目录下)

看到效果了吧,就这么几行程序,图形界面的程序就出来了,简单吧,要是用VC来开发同

样的程序,那代码可以很多了。

看看我的linux下和windows下的程序效果:

如果将QLabel *label=new QLabel("Hello Qt !",0);改为:

QLabel *label = new QLabel("

HelloQt!

");

看看效果又会怎样?熟悉html的人一看上面这一句就知道效果了,因为它就是html的语

法,哈哈。

Qt开发入门(1)-单文件Qt程序

来源《C++ GUI Qt4编程(第二版)》

再来一个稍微复杂一点的,在用户目录下新建文件夹test,进入该文件夹,新建文件

内容如下(实际的程序中没有这些行号,这里仅仅是为了便于解释添加的):

1 #include

2 #include

3 #include

4 #include

5 int main(int argc, char *argv[])

6 {

7 QApplication app(argc, argv);

8 QWidget *window = new QWidget;//创建QWidget对象,并作为应用程序的主窗口

9 window->setWindowTitle("Enter Your Age"); //设置窗口标题栏上的文字

10 QSpinBox *spinBox = new QSpinBox(window);

//创建一个QSpinBox,其父窗口是前面创建的window

11 QSlider *slider = new QSlider(Qt::Horizontal,window);

//创建一个水平方向的滑动块

12 spinBox->setRange(0, 130); //设置滚动的范围

13 slider->setRange(0, 130); //设置滑动的范围

14 QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider,

SLOT(setValue(int))); //信号与槽函数的连接

15 QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox,

SLOT(setValue(int))); //信号与槽函数的连接

16 spinBox->setValue(35); //设置初始值

17 QHBoxLayout *layout = new QHBoxLayout; //创建一个水平盒装的布局

18 layout->addWidget(spinBox); //将滚动微调框添加到布局里,它将自动按布局摆放

19 layout->addWidget(slider); //将滑动块添加到布局里,它将自动按布局摆放

20 window->setLayout(layout); //设置窗口的布局

21 window->show(); //显示

22 return ();

23 }

这个应用程序由三个窗口部件组成:一个QSpinBox,一个QSlider和一个QWidget,从这

里你也可以看到,Qt的部件都是以Q字母开头的。QWidget是这个应用程序的主窗口。

QSpinBox和QSlider会显示在QWidget中,它们都是QWidget的窗口部件,而QWidget窗

口部件则是它们的父对象,QWidget及它的所有子类都会带一个参数QWidget *,以用来

说明谁是它们的父窗口部件。

程序还是比较简单易懂的,关键的地方只是第14,15行,这两行是Qt的重要部分:

信号和槽:

信号和槽的机制是Qt编程的基础。它可以让应用程序编程人员把这些互不了解的对

象绑定在一起。

大多数Qt的部件在特定的时候(如获得输入焦点,被鼠标点击,值发生改变等)都

会发送信号,信号看起来像是函数一样,其中的参数是信号的值。如第16行将滚动微调框

的值设置为35,当发生这种情况是,这个QSpinBox部件就会发射valueChanged(int)信号,

其中,int的参数的值是35。

槽和普通的C++成员函数几乎一样--可以是虚函数,可以被重载,可以是公有的、

保护的或者私有的,并且可以被其他C++成员函数直接调用;还有,它们的参数可以是任意

类型。唯一的不同是:槽还可以和信号连接在一起,在这种情况下,每当发射这个信号的

时候,就会自动调用连接的槽。

connect()语句看起来会是如下的样子:

connect(sender,SINGAL(singal),receiver,SLOT(slot));

这里的sender和receiver是指向QObject的指针,此程序中就是滚动微调框和滑块

部件。singal和slot是不带参数的函数名。而SINGAL和SLOT是两个C++的宏,它们会将

其参数转换成相应的字符串。

在这个程序例子中,我们没有定义信号,也没有定义槽函数,用的是这两个部件本身

提供的信号和函数,一般的输入部件都有valueChanged信号,用来表示部件接受的输入值

发生了变化以及变化后的值,而它们也有函数setValue来设置其值,因此:第14行当这

个spinBox的值改变的时候,slider部件就会接收到信号并设置自己的值与它一样,15行

也是同样的道理。程序的编译运行方法见前面的文章“开发第一个Qt程序--Hello Qt ”

程序的执行效果如下图:

Qt开发入门(2)-多文件Qt程序

这个例子演示一个类似QQ登录的对话框。如下图所示:

源代码分别保存在qqLoginDlg.h和文件中。首先介绍qqLoginDlg.h

文件:

1 #ifndef QQLOGIN_H

2 #define QQLOGIN_H

3 #include

4 class QLabel;

5 class QLineEdit;

6 class QPushButton;

7 class QQLoginDlg : public QDialog

8 {

9 Q_OBJECT

10 public:

11 QQLoginDlg(QWidget *parent = 0);

12 private:

13 QLabel *label1;

14 QLabel *label2;

15 QLineEdit *userNameLEdit;

16 QLineEdit *passwordLEdit;

17 QPushButton *loginButton;

18 QPushButton *clearButton;

19 private slots:

20 void login();

21 void enableLoginButton(const QString &text);

22 };

23 #endif

第1、2行(以及后面的23行)能够防止对这个头文件的多重包含。第3行包含了

QDialog的定义,它是Qt中对话框的基类。第4行到第6行前置声明了一些用于这个对话

框实现中的Qt类。前置声明会告诉C++编译程序类的存在,而不用提供类定义中的所有细

节(通常放在它自己的头文件中)。第7行接下来定义QQLoginDlg,并让他成为QDialog

的子类。对于定义了信号和槽的类,在类定义的开始处使用Q_OBJECT宏都是必须的,正如

第9行所示。

第11行的构造函数是一个典型的Qt窗口部件类的定义方式。parent参数指定了它的

父窗口部件。该参数的默认值是一个空指针,意味着该对话框没有父对象。

由上图可以看到,这个应用程序包含两个标签文本,两个文本行输入框以及两个按钮,

因此在类声明的private部分,声明了这些部件的指针,如第13行至18行。对于这些似

有变量,我们使用了它们的类前置声明。这是可行的,因为它们都是指针,而且没有必要

在头文件中就去访问它们,因而编译程序就无须这些类的完整定义。我们没有包含与这几

个类相关的文件(如,等),而是使用了一些前置声明,这可以使编译

过程更快一些。

第19至21行声明了两个槽函数,其中的slots关键字实际上是一个宏,C++预处理

器会在编译程序找到它们之前将它转换成标准的C++ 代码。

下面来看实现文件:

1 #include

2 #include "qqLoginDlg.h"

3 QQLoginDlg: : QQLoginDlg(QWidget *parent): QDialog(parent)

4 {

5 label1 = new QLabel(tr("User &Name:"));

6 label2 = new QLabel(tr("& Password:"));

7 userNameLEdit = new QLineEdit;

8 label1->setBuddy(userNameLEdit);

9 passwordLEdit = new QLineEdit;

10 label2->setBuddy(passwordLEdit);

11 loginButton = new QPushButton(tr("&Login"));

12 loginButton->setDefault(true);

13 loginButton->setEnabled(false);

14 clearButton = new QPushButton(tr("Clear"));

15 connect(passwordLEdit, SIGNAL(textChanged(const QString &)),

this, SLOT(enableLoginButton(const QString &)));

16 connect(loginButton, SIGNAL(clicked()),this, SLOT(login()));

17 connect(clearButton, SIGNAL(clicked()),userNameLEdit, SLOT(clear()));

18 connect(clearButton, SIGNAL(clicked()),passwordLEdit, SLOT(clear()));

19 QHBoxLayout *userNameLayout = new QHBoxLayout;

20 userNameLayout->addWidget(label1);

21 userNameLayout->addWidget(userNameLEdit);

22 QHBoxLayout *passwordLayout = new QHBoxLayout;

23 passwordLayout->addWidget(label2);

24 passwordLayout->addWidget(passwordLEdit);

25 QVBoxLayout *leftLayout = new QVBoxLayout;

26 leftLayout->addLayout(userNameLayout);

27 leftLayout->addLayout(passwordLayout);

28 QVBoxLayout *rightLayout = new QVBoxLayout;

29 rightLayout->addWidget(loginButton);

30 rightLayout->addWidget(clearButton);

31 QHBoxLayout *mainLayout = new QHBoxLayout;

32 mainLayout->addLayout(leftLayout);

33 mainLayout->addLayout(rightLayout);

34 setLayout(mainLayout);

35 setWindowTitle(tr("QQ"));

36 setFixedHeight(sizeHint().height());

37 }

38 void QQLoginDlg::login()

38 {

40 QString userName = userNameLEdit->text();

41 QString password = passwordLEdit->text();

42 if("888888"==userName)

43 {

44 if("888888"==password){QMessageBox::information(this,

tr("congration"),tr("welcome!"));}

45 else QMessageBox::information(this,tr("warning"),

tr("password id invalide!"));

46 }

47 else QMessageBox::information(this,tr("warining"),

tr("this user is not exist!"));

48 }

49 void QQLoginDlg::enableLoginButton(const QString &text)

50 {

51 loginButton->setEnabled(!y());

52 }

首先,需要包含,该头文件包含了Qt GUI类的定义。Qt有数个模块组成,

每个模块都有自己的类库,最为重要的模块有QtCore、QtNetwork、QtOpenGL、QtScript、

QtSvg和QtXml。其中,在头文件中为构成QtCoew和QtGui组成部分的所有类进行

了定义。在程序中包含这个头文件,就能够使我们省去在每个类中分别包含的麻烦。

在第3行,把parent参数传递给基类的构造函数,然后创建了=子窗口部件。在字

符串外围的tr()函数调用是把它们翻译成其他语言的标记,即使不打算将应用你程序翻译

成其他语言,但在每个用户可见的字符串周围使用tr()函数还是一个很不错的习惯。

在这些字符串中,使用了表示"与"操作的符号"&"来表示快捷键。例如第11行创建了

一个login按钮,用户可以在那些支持快捷键的平台下通过按下Alt+L快捷键来激活它。

符号"&"还可以用来控制焦点:在第5行创建了一个带有快捷键(Alt+N)的标签,而在

第8行设置了行编辑输入框作为这个标签的伙伴。所谓伙伴(buddy),就是一个窗口部件,

它可以在按下标签的快捷键时接收焦点(focus)。所以,当用户按下Alt+N时,焦点会移动

到这个行编辑输入框里。

在第12行,通过调用setDefault(true)让Login按钮成为对话框的默认按钮。默认

按钮就是当用户按下Enter键时对应被按下的按钮。在第13行,禁用了Login按钮。当禁

用一个窗口部件时,它通常会是灰色的,并且不能和用户发生相互操作。

接下来的第15至18行将信号与槽函数进行连接,很容易理解:第15行,当口令框

passwordLEdit这个行编辑输入框中的文本发生变化,就会调用对话框的私有槽函数

enableLoginButton(const QString &)。第16行,当单击loginButton这个按钮时,会调

用login()私有槽。一个信号可以与多个槽函数连接,第17、18行正是这样,当单击

clearButton按钮时,userNameLEdit和passwordLEdit这两个行编辑部件都会调用它们的

槽函数clear(),这个函数用于清空输入文本部件中的内容。

接下来的第19至34行是使用布局管理器摆放这些前面创建的子窗口部件。布局中既

可以包含多个窗口部件,也可以包含其他子布局。其中,QHBoxLayout是横向的盒子布局,

在其中的部件是一个接一个从左到右摆放的;而QVBoxLayout布局则是纵向摆放的。所以,

第19至21行的布局userNameLayout中横向摆放了label1和userNameLEdit,而22行至

24行则是在布局passwordLayout中横向摆放了label2和passwordLEdit,而这两个布局

又作为子布局被纵向摆放在布局leftLayout中。Qt中还有一个网格布局QGridLayout,通

过使用QHBoxLayout、QVBoxLayout和QGridLayout这三个布局的不同嵌套组合,就可以构

建出相当复杂的对话框来。

第38行至48行是槽函数login的定义,该函数很简单,读取用户名输入框和口令输

入框的值,如果都是输入的"888888",则显示提示信息welcome!

第49至52行是槽函数enableLoginButton(const QString &text)的定义,只要用户

改变了口令框中的文本,就会调用这个槽。如果在口令行编辑输入框中有文本,该槽就会

启用Login按钮,否则就会禁用它。

下面来看主函数文件:

1 #include

2 #include "qqLoginDlg.h"

3 int main(int argc, char *argv[])

4 {

5 QApplication app(argc, argv);

6 QQLoginDlg *dialog = new QQLoginDlg;

7 dialog->show();

8 return ();

9 }

不用解释就很明了,创建一个我们自定义的对乎况并显示。

编译方法:

介绍windows下的情况,在linux下类似:

将这三个文件保存到同一个目录下,比如d:qq目录下,打开qt command prompt,然后进

入该目录,依次运行如下命令:

qmake -project

qmake

make

cd debug

可以看到程序的运行效果了,见下图,哈哈。

版权所有 @ by Jerry(/home/?uid=2)