`
izuoyan
  • 浏览: 8938186 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Qt学习之路(8): 创建一个对话框(下)

阅读更多
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/198988
接着前一篇,下面是源代码部分:
#include <QtGui>
#include "finddialog.h"

FindDialog::FindDialog(QWidget *parent)
: QDialog(parent)
{
label = new QLabel(tr("Find &what:" ));
lineEdit = new QLineEdit;
label->setBuddy(lineEdit);

caseCheckBox = new QCheckBox(tr("Match &case" ));
backwardCheckBox = new QCheckBox(tr("Search &backford" ));

findButton = new QPushButton(tr("&Find" ));
findButton->setDefault(true );
findButton->setEnabled(false );

closeButton = new QPushButton(tr("Close" ));

connect(lineEdit, SIGNAL(textChanged(const QString&)), this , SLOT(enableFindButton(const QString&)));
connect(findButton, SIGNAL(clicked()), this , SLOT(findClicked()));
connect(closeButton, SIGNAL(clicked()), this , SLOT(close()));

QHBoxLayout *topLeftLayout = new QHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);

QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(backwardCheckBox);

QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(findButton);
rightLayout->addWidget(closeButton);
rightLayout->addStretch();

QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
setLayout(mainLayout);

setWindowTitle(tr("Find" ));
setFixedHeight(sizeHint().height());
}

FindDialog::~FindDialog()
{

}

void FindDialog::findClicked()
{
QString text = lineEdit->text();
Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseInsensitive : Qt::CaseSensitive;
if (backwardCheckBox->isChecked()) {
emit findPrevious(text, cs);
} else {
emit findNext(text, cs);
}
}

void FindDialog::enableFindButton(const QString &text)
{
findButton->setEnabled(!text.isEmpty());
}

CPP文件要长一些哦——不过,它们的价钱也会更高,嘿嘿——嗯,来看代码,第一行include的是QtGui。Qt是分模块 的,记得我们建工程的时候就会问你,使用哪些模块?QtCore?QtGui?QtXml?等等。这里,我们引入QtGui,它包括了QtCore和 QtGui模块。不过,这并不是最好的做法,因为QtGui文件很大,包括了GUI的所有组件,但是很多组件我们根本是用不到的——就像Swing的 import,你可以import到类,也可以使用*,不过都不会建议使用*,这里也是一样的。我们最好只引入需要的组件。不过,那样会把文件变长,现在 就先用QtGui啦,只要记得正式开发时不能这么用就好啦!

构造函数有参数初始化列表,用来调用父类的构造函数,相当于Java里面的super()函数。这是C++的相关知识,不是Qt发明的,这里不再赘述。
然后新建一个QLabel。还记得前面的Hello, world!里面也使用过QLabel吗?那时候只是简单的传入一个字符串啊!这里怎么是一个函数tr()?函数tr()全名是 QObject::tr(),被它处理的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用。这以后还会仔细讲解,只要记住,Qt的最佳实践:如果你想让你的程序国际化的话,那么,所有用户可见的字符串都要使用QObject::tr()! 但是,为什么我们没有写QObject::tr(),而仅仅是tr()呢?原来,tr()函数是定义在Object里面的,所有使用了Q_OBJECT宏的类都自动具有tr()函数。
字符串中的&代表快捷键。注意看下面的findButton的&Find,它会生成F ind字符串,当你按下 Alt+F的时候,这个按钮就相当于被点击——这么说很难受,相信大家都明白什么意思。同样,前面label里面也有一个&,因此它的快捷键就是 Alt+W。不过,这个label使用了setBuddy函数,它的意思是,当label获得焦点时,比如按下Alt+W,它的焦点会自动传给它的 buddy,也就是lineEdit。看,这就是伙伴的含义(buddy英文就是伙伴的意思)。
后面几行就比较简单了:创建了两个QCheckBox,把默认的按钮设为findButton,把findButton设为不可用——也就是变成灰色的了。
再下面是三个connect语句,用来连接信号槽。可以看到,当lineEdit发出textChanged(const QString&)信号时,FindDialog的enableFindButton(const QString&)函数会被调用——这就是回调,是有系统自动调用,而不是你去调用——当findButton发出clicked()信号 时,FindDialog的findClicked()函数会被调用;当closeButton发出clicked()信号时,FindDialog的 close()函数会被调用。注意,connect()函数也是QObject的,因为我们继承了QObject,所以能够直接使用。
后面的很多行语句都是layout的使用,虽然很复杂,但是很清晰——编写layout布局最重要一点就是思路清楚,想清楚哪个套哪个,就会很好编写。这里我们的对话框实际上是这个样子的:
注意那个spacer是由rightLayout的addStretch()添加的,就像弹簧一样,把上面的组件“顶起来”。
最后的setWindowTitle()就是设置对话框的标题,而setFixedHeight()是设置成固定的高度,其参数值sizeHint()返回“最理想”的大小,这里我们使用的是height()函数去到“最理想”的高度。
好了,下面该编写槽了——虽然说是slot,但实际上它就是普通的函数,既可以和其他函数一样使用,又可以被系统回调。
先看findClicked()函数。首先取出lineEdit的输入值;然后判断caseCheckBox是不是选中,如果选中就返回 Qt::CaseInsensitive,否则返回Qt::CaseSensitive,用于判断是不是大小写敏感的查找;最后,如果 backwardCheckBox被选中,就emit(发出)信号findPrevious(),否则emit信号findNext。
enableFindButton()则根据lineEdit的内容是不是变化——这是我们的connect连接的——来设置findButton是不是可以使用,这个很简单,不再说了。
这样,FindDialog.cpp也就完成了。下面编写main.cpp——其实QtCreator已经替我们完成了——
#include <QApplication>

#include "finddialog.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
FindDialog *dialog = new FindDialog;
dialog->show();
return app.exec();
}
运行一下看看我们的成果吧!
虽然很简单,也没有什么实质性的功能,但是我们已经能够制作对话框了——Qt的组件成百上千,不可能全部介绍完,只能用到什么学什么,更重要的是,我们已经了解了其编写思路,否则的话,即便是你拿着全世界所有的砖瓦,没有设计图纸,你也不知道怎么把它们组合成高楼大厦啊!
嘿嘿,下回见!

本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/198988

分享到:
评论

相关推荐

    Qt4-学习之路1

    (1):前言 4 (4):初探信号槽 12 (5):组件布局 13 (6): API 文档的使用 16 (7): 创建一个对话框(上) 17 (8): 创建一个

    QT学习之路2 (1~82篇)

    8. 添加动作 9. 资源文件 10. 对象模型 11. 布局管理器 12. 菜单栏、工具栏和状态栏 13. 对话框简介 14. 对话框数据传递 15. 标准对话框 QMessageBox 16. 深入 Qt5 信号槽新语法 17. 文件对话框 18. 事件 19. 事件的...

    qt必备学习手册初级

    2.4 一个最简单的Qt应用程序 12 3 信号和槽机制 13 3.1 信号和槽 13 3.2 自定义信号槽 15 自定义信号槽需要注意的事项 18 信号槽的更多用法 18 3.3 Lambda表达式 19 4 Qt窗口系统 21 4.1 Qt窗口坐标体系 21 坐标体系...

    Qt4编程.pdf

    5.3使用QtDemo学习Qt应用程序开发 5.4问题与解答 5.5总结与提高 第6章Qt4程序开发方法和流程 6.1开发方法 6.2HelloQt 6.2.1基本流程 6.2.2源码分析 6.2.3.编译运行 6.2.4第2种方法 6.2.5第3种方法 6.3几个重要的...

    24小时学通qt编程

    第二部分——重要的Qt部件,介绍常用Qt部件使用方法,以及怎样绘制图形和创建对话框等。第三部分——深入学习Qt,介绍布局管理器、文件和目录、文本和常规表达式、容器类、图形、程序间通信等内容。第四部分——Qt...

    24小时学通qt编程(PDF)

    重要的Qt部件,介绍常用Qt部件使用方法,以及怎样绘制图形和创建对话框等。第三部分&mdash;&mdash;深入学习Qt,介绍布局管理器、文件和目录、文本和常规表达式、容器类、图形、程序间通信等内容。第四部分&mdash;&...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 实现原理: 程序里我们先建立一个主工程,作为主界面,然后再建立一个对 话框类,将其加入工程中,然后在程序中调用自己新建的对话框类...

    C++_GUI_Programming_with_Qt_4_CH

    创建对话框 第三章.创建主窗体 第四章.实现程序功能 第五章.创建自定义空间 第二部分:中级QT 第六章.布局管理器 第七章.事件处理 第八章.2D和3D绘图 第九章.拖拽和扔放操作 第十章. “项浏览”类 第十一章.容器类 第...

    精通qt4编程(源代码)

    \1.1.3 编译/运行第一个Qt应用程序 8 \1.1.4 第一个Qt程序的代码分析 8 \1.2 使用Qt布局管理器 11 \1.3 关联操作 12 \1.4 小结 13 \第2章 对话框——QDialog 14 \2.1 自定义对话框 14 \2.1.1 建立新类 14 \2.1.2 ...

    精通Qt4编程(第二版)源代码

    \——QDialog 卢传富介绍了Qt的对话框类QDialog,实现了一个自定义的登录对话框,举例说明了Qt提供的内建对话框类的应用。 14 \ 第3章 基础窗口部件——QWidget 卢传富 \蔡志明首次引入Qt设计器的使用,绘制并实现...

    QT+Visual Studio 2019 的节目登记(含报告)

    1 创建基于对话框的应用程序,添加按钮、编辑框等控件; 2 设计报名表的数据结构(如:以数组或者动态链表)和相应的类; 3 完成对报名节目中记录的增加、修改、删除和显示。 4 将报名数据存入文件。能够打开并...

    MTDialog.zip

    Qt中模态对话框与非模态对话框的创建,可以供初学者学习

    基于QT和C++实现的火车票管理系统源码+项目说明.zip

    * **退票界面** 首先会弹出一个对话框进行引导操作。在输入框内输入购票记录的序号,再点击退票。这时会弹出一个对话框确认删除,注意退票不可恢复。 * **改签界面** 首先会弹出一个对话框进行引导操作。先在右侧...

    Linux程序设计 第4版.haozip01

    14.1.2 一个理论性的例子 489 14.1.3 linux的信号量机制 490 14.1.4 使用信号量 492 14.2 共享内存 496 14.2.1 shmget函数 497 14.2.2 shmat函数 497 14.2.3 shmdt 498 14.2.4 shmctl 498 14.3 消息队列 502...

    Linux程序设计 第4版.haozip02

    14.1.2 一个理论性的例子 489 14.1.3 linux的信号量机制 490 14.1.4 使用信号量 492 14.2 共享内存 496 14.2.1 shmget函数 497 14.2.2 shmat函数 497 14.2.3 shmdt 498 14.2.4 shmctl 498 14.3 消息队列 502...

    PyQt4 精彩实例分析26个例子

    pyqt4精彩实例讲解,适合pyqt4初级学习者,经供参考第6行创建了一个 QPush Button对象,并设置它的显示文木为“ Hello Kitty!&quot;,由于此处并 没有指定按钮的父窗体,因此以自己作为主窗凵 第7行调用show()方法,显示...

    嵌入式Linux应用程序开发标准教程(第2版全)

    《嵌入式Linux应用程序开发标准教程(第2版)》主要分为3个部分,包括Linux基础、搭建嵌入式Linux环境和嵌入式Linux的应用开发。Linux基础部分从Linux基础、基本操作命令讲起,为Linux初学者能快速入门提供了保证。...

    嵌入式Linux应用程序开发详解

    目录 第1章 Linux快速入门 1 1.1 嵌入式Linux基础 1 1.1.1 Linux发展概述 1 ...12.2.6 Qt/Embedded对话框设计 416 12.3 实验内容——使用Qt编写“Hello,World”程序 420 本章小结 428

Global site tag (gtag.js) - Google Analytics