QT第一篇——创建对话框
程序员文章站
2022-07-13 23:34:52
...
前言
本文参考资料:
- Jasmin Blanchette<C++ GUI QT4编程(第二版)> 电子工业出版社
本文主要实现功能为:编写一个Find对话框。其运行效果如下图所示:
在QT中,一个整体的部件可以封装为一个类。而一个类分别对应一个cpp文件和一个h文件。所以本章内容共包含3个文件:
- finddialog.h
- finddialog.cpp
- main.cpp
通过运行效果图,可以看出这个对话框中包含以下几种类型:
- class QCheckBox;
- class QLabel;
- class QLineEdit;
- class QPushButton;
如下图:
另外,还可以考虑到:
- 只有当搜寻框中填写有效字母,才能使得Find按键有效。
- 只有按下Find按钮,对话框才会发送查询信号。而根据Search back选项,可以查询信号应该有两种,向前查询与向后查询。
- 只有按下close按钮,对话框才会退出。
综上,这个对话框可以出发三种动作,所以对应三个connet()函数。而FindDialog类自身应该包含两个槽函数。分别对应查询框文本变化和Find按键被按下。close按键按下应该调用继承的close函数,无需再定义。
头文件
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include<QDialog>//QT对话框的基类
//对话框中用到的QT类 声明
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
class FindDialog:public QDialog
{
//对于定义信号和槽的类,这个宏是必需的
Q_OBJECT
public:
FindDialog(QWidget *parent=0);
signals://信号
void findNext(const QString &str,Qt::CaseSensitivity cs);//此处const和&同时使用的目的,是为了加快程序执行速度。不用复制自定义对象的同时,也不会改变自定义对象内容
void findPrevious(const QString &str,Qt::CaseSensitivity cs);
private slots://槽
void findClicked();
void enableFindButton(const QString &text);
private:
QLabel *label;//标签控件
QLineEdit *lineEdit;//文本框
QCheckBox *caseCheckBox;//大小写字母复选框
QCheckBox *backwardCheckBox;//向后查询复选框
QPushButton *findButton;//查找按键
QPushButton *closeButton;//关闭按键
};
#endif // FINDDIALOG_H
C文件
#include<QtGui>
#include"finddialog.h"
//构造函数
FindDialog::FindDialog(QWidget *parent):QDialog(parent)
{
/**************1.创建子控件*****************/
//第一部分:查找内容
label=new QLabel(tr("Find &what:"));//创建一个标签
lineEdit=new QLineEdit;//创建一个文本框
label->setBuddy(lineEdit);//将文本框作为标签的友好控件
//第二部分:查找选项
caseCheckBox=new QCheckBox(tr("Match &case"));//大小写敏感选项
backwardCheckBox=new QCheckBox(tr("Search &back"));//查找方向选项
//第三部分:触发按钮
findButton=new QPushButton(tr("&Find"));//创建查找按钮
findButton->setDefault(true);//将查找按钮设置为默认按钮
findButton->setEnabled(false);//查找按钮默认不使能
closeButton=new QPushButton(tr("close"));//创建关闭按钮
/*****************2.连接信号槽**********************/
connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(enableFindButton(const QString &)));//只要查找内容改变,调用查找按键使能函数
connect(findButton,SIGNAL(clicked()),this,SLOT(findCliked()));//当find按键按下,触发findClicked函数
connect(closeButton,SIGNAL(clicked()),this,SLOT(close()));//当close按键按下,关闭当前对话框
/*****************3.布局子控件**********************/
//需要注意的是,布局共用了两种布局类:
//QHBoxLayout:水平排列
//QVBoxLayout:垂直排列
QHBoxLayout *topLayout=new QHBoxLayout;//创建上布局,包括标签和文本框
topLayout->addWidget(label);
topLayout->addWidget(lineEdit);
QVBoxLayout *leftLayout=new QVBoxLayout;//创建左布局,包括上布局和两个复选框
leftLayout->addLayout(topLayout);
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);
/*****************4.设置对话框自身属性********************/
setWindowTitle("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);
}else
{
emit findNext(text,cs);
}
}
//按键使能
void FindDialog::enableFindButton(const QString &text)
{
findButton->setEnabled(!text.isEmpty());
}
主函数文件
#include "finddialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
FindDialog *findDialog=new FindDialog;
findDialog->show();
return a.exec();
}
上一篇: 单例模式示例
下一篇: java单例模式的正确写法