找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

【Linux公开课】Qt编程实战!

admin 2019-2-9 10:41 126人围观 Qt相关

作者:ZLG致远电子





摘要

由于Qt具有良好的可移植性,在桌面版本中编译运行成功的应用程序,一般只需要用交叉编译工具的qmake重新编译,即可在目标板上运行。执行嵌入式的qmake(别名qmake-arm),重新交叉编译,便可获得嵌入式版本的Qt程序。

文员也能看懂学通的《嵌入式Linux开发教程》正式开始免费连载啦!致远电子微信公众平台【独家首发】。在这个教程中,你看不到自我陶醉的炫技,内容通俗易懂,实用够用为先。本教程凝聚了ZLG致远电子嵌入式工程师的心血,转载请【注明出处】。

14.8 Qt编程实战

接下来将要介绍一些功能部件的简单使用方法,然后在最后通过一个经典的小游戏—贪食蛇示例来说明功能部件之间的组合使用。

这些例子都是手动敲代码,然后用桌面版的qmake(即我们设置别名的qmake-qt4指令)进行编译,而不是借助IDE来进行编程。因为这样可以让读者更加明白代码的运作原理。

14.8.1 按钮

本例子由一个按钮构成,这个应用程序的源代码与Hello程序的源代码非常相似,quitButton源代码如程序清单14.2所示。

程序清单14.2 quitButon.cpp源码


1 /* quitButton.cpp */

2 #include <QApplication> /* 包含类QApplication的定义 */

3 #include <QPushButton> /* 包含类QPushButton的定义 */

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

5 {

6 QApplication app(argc, argv);

7 QPushButton *button = new QPushButton("Quit") ; /*创建一个显示为Quit的按钮窗口部件*/

8 button->show(); /* 使按钮可见 */

9 return app.exec();

10 }


第5行创建了一个QApplication对象,用来管理整个应用程序所用到的资源。Qt支持一些命令行参数,所以这个QApplication构造函数需要两个参数,分别是argc和argv。

第8行将应用程序的控制权转移给Qt。此时,程序将进入事件循环状态,程序会等候用户的动作,例如鼠标单击和按键等操作。

新建一个quitButton目录,然后在该目录下添加quitButton.cpp,内容如上述程序清单1.2所示,然后在该目录下执行如下命令进行编译和执行。


$ qmake-qt4 –project

$ qmake-qt4

$ make


PC上执行过程如图14.31所示。



图14.31 quitButton编译和执行过程

由于没有为按钮按下的事件提供任何处理。所以无法按下“按钮”之后退出窗口。这个功能可以通过后面将要介绍的信号与槽的机制来实现。

14.8.2 标签和文本框

这一节将简单说明一下窗口加入标签和文本框的使用方法。与按钮源代码差不多,只是调用的类不同而已。

本例由三个窗口部件组成:QLabel,QLineEdit和QWidget。QWidget是该应用程序的主窗口。QLabel和QLineEdit会显示在QWidget中,它们都是QWidget窗口部件的子对象。另外,为了将窗口部件摆放整齐,调用了Qt的布局管理器。下一小节将具体介绍布局管理器的使用方法。

程序清单14.3 account.cpp源代码


1 /* account.cpp */

2 #include <QApplication>

3 #include <QLabel>

4 #include <QLineEdit>

5 #include <QHBoxLayout>

6

7 intmain(int argc, char *argv[])

8 {

9 QApplication app(argc, argv);

10 QWidget *window = new QWidget; /* 创建Qwidget对象,作为主窗口*/

11 window->setWindowTitle("Enter Your account"); /*设置显示在窗口标题栏上的文字*/

12

13 QLabel *accountLabel = new QLabel("Account: ", window); /*创建标签对象,并显示为Accoutn */

14 QLineEdit *accountEdit = new QLineEdit(window); /* 创建文本框对象 */

15

16 QHBoxLayout *layout = new QHBoxLayout; /* 创建水平布局管理器 */

17 layout->addWidget(accountLabel);

18 layout->addWidget(accountEdit);

19

20 window->setLayout(layout); /* window窗口上安装该布局管理*/

21 window->show();

22 return app.exec();

23 }


第13和14行把window对象传递给QLabel和QLineEdit的构造函数,说明这两个窗口部件为window的子对象。

第16到18行使用了一个水平布局管理器对标签和文本框进行布局处理。下一小节将具体介绍布局管理器。

建立一个新目录为account,在该目录下添加account.cpp源代码文件,然后调用如下命令进行编译,然后执行。


$ qmake-qt4 –project

$ qmake-qt4

$ make


PC上执行过程如图14.32所示。



图14.32 account编译和运行界面

14.8.3 布局管理器

布局管理器是一个能够对窗口部件的尺寸大小和位置进行设置的对象。Qt有三个主要的布局管理器类:


1、QHBoxLayout:在水平方向上排列窗口部件,从左到右;

2、QVBoxLayout:在垂直方向上排列窗口部件,从上到下;

3、QGridLayout:把各个窗口部件排列在一个网格中。


下面编写一个范例来展示一下布局管理器的灵活用途。本例子将把前两小节的功能部件结合起来使用。

程序清单14.4 layout.cpp


1 /* layout.cpp */

2 #include <QtGui>

3 #include <QApplication>

4

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

6 {

7 QApplication app(argc, argv);

8 QWidget *window = new QWidget;

9 window->setWindowTitle("Layout");

10

11 QLabel *accountLabel = new QLabel("Account: ");

12 QLabel *pwLabel = new QLabel("Password: ");

13 QLineEdit *accountEdit = new QLineEdit;

14 QLineEdit *pwEdit = new QLineEdit;

15 QPushButton *quitButton = new QPushButton("Quit");

16 QPushButton *nextButton = new QPushButton("Next");

17

18 QHBoxLayout *topLayout = new QHBoxLayout; /* 创建一个水平布局管理器 */

19 topLayout->addWidget(accountLabel); /* 从左到右放置窗口部件 */

20 topLayout->addWidget(accountEdit);

21

22 QHBoxLayout *downLayout = new QHBoxLayout;

23 downLayout->addWidget(pwLabel);

24 downLayout->addWidget(pwEdit);

25

26 QVBoxLayout *leftLayout = new QVBoxLayout; /* 创建一个垂直布局管理器 */

27 leftLayout->addLayout(topLayout); /* 内嵌布局管理器 */

28 leftLayout->addLayout(downLayout);

29 leftLayout->addStretch(); /* 添加分隔符 */

30

31 QVBoxLayout *rightLayout = new QVBoxLayout; /* 创建一个垂直布局管理器 */

32 rightLayout->addWidget(quitButton); /* 从上到下放置窗口部件 */

33 rightLayout->addWidget(nextButton);

34 rightLayout->addStretch();

35

36 QHBoxLayout *mainLayout = new QHBoxLayout;

37 mainLayout->addLayout(leftLayout);

38 mainLayout->addLayout(rightLayout);

39

40 QObject::connect(quitButton, SIGNAL(clicked()), &app, SLOT(quit()));

41 window->setLayout(mainLayout);

42 window->show();

43 return app.exec();

44 }


第29行和34行添加了分隔符(或者称为伸展器),用它来占据余下的空白区域,这样可以确保如果用户将窗口高度变高,可以确保这些按钮和标签部件可以完全占用它们所在布局的上部空间,不会跟随窗口高度变高而变高。

使用布局管理器摆放这些子窗口部件,布局中既可以包含多个窗口部件,也可以包含其他子布局。通过QHBoxLayout、QVBoxLayout和QGridLayout这三个布局的不同嵌套组合,就可能构建出相当复杂的布局层次。如下图14.33所示:



图14.33 Layout层次图

当将子布局对象添加到父布局对象中时(第27、28、37和38行),子布局对象里面的窗口部件就会自动重定义自己的父对象。换言之,当将主布局装到window对象中时(第42行)时,它就会成为window指向的对象的子对象了。于是它的所有子窗口部件都会重定义自己的父对象,从而变成window的子对象。

建立一个新目录为layout,在该目录下添加layout.cpp源代码文件,然后调用如下命令进行编译和执行。


$ qmake-qt4 –project

$ qmake-qt4

$ make


PC上的执行过程如图14.34所示。



图14.34 layout编译和执行过程

有任何疑问请直接在微信对话框中输入您的留言,小编非常乐意为您解答。






致远电子 (ID: ZLG_zhiyuan )
还没关注致远电子?您将错过每日泛着油光的干货!您将错过一段颠覆洋品牌的历史!!有时候你想证明给一万个人看,到后来,你发现只得到了一个明白的人,那就够了。你是我们期待已久的粥粉么?我们的微信号:ZLG_zhiyuan。




-------------------------------------------------------------------------
我们尊重原创,也注重分享,如若侵权请联系qter@qter.org。
-------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......