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 }
首先,需要包含
每个模块都有自己的类库,最为重要的模块有QtCore、QtNetwork、QtOpenGL、QtScript、
QtSvg和QtXml。其中,在
了定义。在程序中包含这个头文件,就能够使我们省去在每个类中分别包含的麻烦。
在第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)
发布评论