最终效果图:

该对话框由三个文件组成:finddialog.h 、finddialog.cpp、 main.cpp

代码+注释

 /*--finddialog.h--*/
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <QDialog>
/*Qt中类的前向声明,会让编译速度更快*/
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
class FindDialog:public QDialog//FindDialog 从QDialog继承
{
Q_OBJECT//宏定义,如果类中使用了signal或者slots就要声明这个宏
public:
FindDialog(QWidget *parent = );//构造函数是Qt控件类的标准格式,默认的父参数为NULL ,说明没有父控件
signals:/*声明了这个对象发出两个信号,向前查找和向后查找信号.signal也是一个宏,编译之前,C++预处理把它变成标准的C++代码*/
void findNext(const QString &str,Qt::CaseSensitivity cs);//Qt::CaseSensitivity是一个枚举类型,有两个值Qt::CaseSensitive,Qt::CaseInsensitive
void findPrevious(const QString &str,Qt::CaseSensitivity cs);
private slots:/*slot和signal一样也是个宏。声明了两个slot函数,为了实现函数需要用到对话框的其他控件的信息,所以保存了一些控件的指针*/
void findClicked();
void enableFindButton(const QString &text);
private:/*对于私有成员变量,只是使用了指针,并没有存取操作,编译器不用知道它们的详细定义,所以使用了类的前项定义*/
QLabel *label;
QLineEdit *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *backwardCheckBox;
QPushButton *findButton;
QPushButton *closeButton;
};
#endif // FINDDIALOG_H
/*更多内容待更新,AQ 2016.10.25 信息楼555室*/
 /*--finddialog.cpp--*/
#include <QtGui>
#include <QtWidgets>
#include <QLabel>
#include <QLineEdit>
#include "finddialog.h"
FindDialog::FindDialog(QWidget *parent):QDialog(parent)
{
label = new QLabel(tr("Find &what:"));//创建一个label标签,并初始化标签
lineEdit = new QLineEdit;//创建一个文本框对象
label->setBuddy(lineEdit);//label 的快捷键是 "ALT+w",按下快捷键时,输入焦点自动跳到label的buddy——lineEdit上 caseCheckBox = new QCheckBox(tr("Match &case"));
backwardCheckBox = new QCheckBox(tr("Search &backward"));
/*初始化了两个复选框,并且初始化复选框的标签文字*/ findButton = new QPushButton(tr("&Find"));
findButton->setDefault(true);
findButton->setEnabled(false);
/*创建Find按钮,设置该按钮为对话框默认按钮,即用户按下回车,由该按钮接受事件,并设置按钮当前不可用*/ closeButton=new QPushButton(tr("Close"));//创建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()));
/*以上绑定(连接)信号,第一个文本框内容发生改变,则调用自己(this)的enableFindButton(...)响应函数
第二个用户按下find按钮发出clicked()事件,由它自己(this)的findClicked()函数去执行
第三个用户点击close按钮发出clicked()事件,由它自己(this)的close()函数去执行
*/ QHBoxLayout *topLeftLayout = new QHBoxLayout;//创建水平排列控件
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);
/*添加标签和文本框到topLeftLayout布局中*/ QVBoxLayout *leftLayout = new QVBoxLayout;//创建垂直排列控件
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(backwardCheckBox);
/*添加topLeftLayout水平控件和两个复选框到leftLayout水平控件中*/ QVBoxLayout *rightLayout = new QVBoxLayout;//创建垂直排列控件
rightLayout->addWidget(findButton);
rightLayout->addWidget(closeButton);
rightLayout->addStretch();//**平均分配
/*添加两个按钮find和close到rightLayout中,并平均分配其位置空间*/ QHBoxLayout *mainLayout= new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
/*创建水平排列控件,并将leftLayout和rightLayout两个布局控件添加到mainLayout布局中*/ setLayout(mainLayout);//设置主窗体的布局为mainLayout setWindowTitle(tr("Find"));//设置主窗体的标题
setFixedHeight(sizeHint().height());//设置窗体的高度
}
void FindDialog::findClicked()//实现响应函数
{
QString text = lineEdit->text();//取得文本框中的内容 Qt::CaseSensitivity cs = caseCheckBox->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive;
if(backwardCheckBox->isChecked()){
emit findPrevious(text,cs);//emit也是个宏
}else{
emit findNext(text,cs);
}
/*根据backwardCheckBox状态发出findPrevious或者findNext信号执行*/
}
void FindDialog::enableFindButton(const QString &text){//响应函数,如果用户改变文本框内容,调用该函数
findButton->setEnabled(!text.isEmpty());//设置find()按钮可用
}
/*更多内容待更新,AQ 2016.10.25 信息楼555室*/
 /*--main.cpp--*/
#include "mainwindow.h"
#include <QApplication>
#include "finddialog.h" int main(int argc, char *argv[])
{
QApplication a(argc, argv);//入口
FindDialog *dialog = new FindDialog;
dialog->show();
return a.exec();
}
/*更多内容待更新,AQ 2016.10.25 信息楼555室*/

QT 初阶 第二章 创建对话框(查找对话框实例)的更多相关文章

  1. [Effective Java]第二章 创建和销毁对象

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. [Effective Java 读书笔记] 第二章 创建和销毁对象 第一条

    第二章  创建和销毁对象 第一条 使用静态工厂方法替代构造器,原因: 静态工厂方法可以有不同的名字,也就是说,构造器只能通过参数的不同来区分不同的目的,静态工厂在名字上就能表达不同的目的 静态工厂方法 ...

  3. QT 初阶 1.3 节 控件的几何排列

    #include "mainwindow.h" #include <QApplication> #include <QHBoxLayout> #includ ...

  4. [Effective Java 读书笔记] 第二章 创建和销毁对象 第二条

    第二条 遇到多个构造器参数时,可以考虑用构建器 当遇到有多个构造器参数时,常见的是用重叠构造器,即: public class TestClass{ public TestClass(int para ...

  5. [Effective Java读书笔记] 第二章 创建和销毁对象(1~7)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537576.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  6. 《R语言实战》读书笔记--第二章 创建数据集

    2.1数据集的概念 变量的类型是不同的,比如标示符.日期变量.连续变量.名义变量.有序型变量等,记得数据挖掘导论中有专门的描述. R可以处理的数据类型包括了数值型.字符型.逻辑型.复数型(虚数).原生 ...

  7. OpenCV2:第二章 创建图像并显示

    一.简介 相当于在PS中,新建一个画布 二.CvMat类/LPLImage和CvMat结构体 参考: OpenCV2:第一章 图像表示 三.create() Mat m(2,2,CV_8UC3); m ...

  8. [Effective Java 读书笔记] 第二章 创建和销毁对象 第五条

    第五条 避免创建不必要的对象 书中一开始举例: String s = new String("stringette"); // don't do this //应该使用下面,只会创 ...

  9. [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条

    第六条 消除过期引用 JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象.这是因为栈的内部维护着对这些对 ...

随机推荐

  1. android 入门笔迹(1)

    环境搭建JDK,JRE,Android SDK,ADT,Eclipse,安卓模拟器AVD xml控制UI界面  Java代码控制UI界面  XML与Java混合控制UI界面  UI:userinter ...

  2. Android  PNG透明图片转JPG格式背景变黑

    Android  PNG透明图片转JPG格式背景变黑 在上传图片是,需要把PNG格式转换成JPG格式的,但是在遇上透明背景时,转过来就变成黑色底图了! 原因是PNG支持透明图而 JPG格式不支持透明底 ...

  3. Doccms 中新闻列表排序无效bug的修复

    手动修改 content/index/list.php 37 为 $sql="Select * FROM ".TB_PREFIX."list Where channelI ...

  4. 绘图: Stroke, Brush

    Stroke - 笔划 Brush - 画笔 示例1.演示“Stroke”相关知识点Drawing/Stroke.xaml <Page x:Class="Windows10.Drawi ...

  5. 【Codeforces 723D】Lakes in Berland (dfs)

    海洋包围的小岛,岛内的有湖,'.'代表水,'*'代表陆地,给出的n*m的地图里至少有k个湖,求填掉面积尽量少的水,使得湖的数量正好为k. dfs找出所有水联通块,判断一下是否是湖(海水区非湖).将湖按 ...

  6. iOS的nil,Null,NSNull的使用

    今天做项目时,在数组里面取值时,发现里面有NSNull的对象,然后用数组里面对应的对象赋值时出现各种问题,总是报错.后面经过研究和查资料,总算解决了这一问题. nil用来给对象赋值(Objective ...

  7. golang学习之旅:使用go语言操作mysql数据库

    1.下载并导入数据库驱动包 官方不提供实现,先下载第三方的实现,点击这里查看各种各样的实现版本.这里选择了Go-MySQL-Driver这个实现.地址是:https://github.com/go-s ...

  8. Leetcode 400. Nth digits

    解法一: 一个几乎纯数学的解法 numbers:   1,...,9, 10, ..., 99, 100, ... 999, 1000 ,..., 9999, ... # of digits:   9 ...

  9. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

  10. 【BZOJ-4435】Juice Junctions 最小割树(分治+最小割)+Hash

    4435: [Cerc2015]Juice Junctions Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 20  Solved: 11[Submi ...