Qt笔记·第四篇子类化QDialog
来源:互联网 发布:有哪些网络调查网站 编辑:程序博客网 时间:2024/06/16 02:33
个人能力有限,有不足错误之处欢迎读者指正!
本教程使用的环境配置部分已经在 Qt4.8.6+VS2010安装配置教程 中说明,不再赘述。有需要的读者可以自行点击链接查看。
新建Qt QDialog类
头文件
#ifndef FINDDIALOG_H#define FINDDIALOG_H#include <QDialog>//在头文件中包含一个大的头文件不是一种良好的编程风格;class QCheckBox;class QLabel;class QLineEdit;class QPushButton;//前置声明会告诉C++编译程序类的存在,而不用提供类定义中的所有细节;class FindDialog : public QDialog{ Q_OBJECT //对于所有定义了信号和槽的类,在类定义开始处的的Q_OBJECT宏都是必须的;public: FindDialog(QWidget *parent = 0); //parent参数指定了它的父窗口部件,该参数的默认值是一个空指针,意味着该窗口没有对象;signals: void findnext(const QString &str,Qt::CaseSensitivity cs); void findprevious(const QString &str,Qt::CaseSensitivity cs); //声明了当用户单击Find按钮时,对话框所发射的两个信号。如果向前查询选项生效,对话框就发射findPrevious()信号,否则它就会发射findNext()信号; //singals关键字实际上是一个宏。C++预处理器会在编译程序找到它之前把它转换成标准C++代码; //Qt::CaseSensitivity是一个枚举类型,它有Qt::CaseSensitive和Qt::CaseInsensitive两个值;private: QLabel *label; QLineEdit *lineEdit; QCheckBox *caseCheckBox; QCheckBox *backwardCheckBox; QPushButton *findButton; QPushButton *closeButton; //我们没有包含与这几个类相关的头文件,而是使用了一些前置声明,这可以使编译过程更快一些;private slots: void findClicked(); void enableFindButton(const QString &text); //在这个类的private段声明了两个槽,为了实现这两个槽,几乎需要访问这个对话框所有的子窗口部件,所以也保留了指向它们的指针; //关键字slots和singals一样也是一个宏,也可以扩展成C++编译程序可以处理的一种结构形式;};#endif // FINDDIALOG_H
cpp文件
#include <QtGui/QtGui>#include "finddialog.h"FindDialog::FindDialog(QWidget *parent) : QDialog(parent) //把parent参数传递给了基类的构造函数,然后创建了子窗口部件;{ label = new QLabel(tr("Find &what:")); //tr()函数的调用是把它们翻译成其它语言的标记; //在这些字符串中,使用了表示“与”的操作符"&"来表示快捷键; lineEdit = new QLineEdit; label->setBuddy(lineEdit); //设置了行编辑器作为伙伴(Buddy),就是一个窗口部件,它可以在按下标签的快捷键时接收焦点; caseCheckBox = new QCheckBox(tr("Match &case")); backwardCheckBox = new QCheckBox(tr("Search &backward")); findButton = new QPushButton(tr("&Find")); findButton->setDefault(true); //通过调用setDefault让Find按钮成为对话框的默认按钮; //默认按钮就是当用户按下Enter键时能够按下对应的按钮; findButton->setEnabled(false); //setEnabled(false)表示禁用了Find按钮,当禁用一个窗口部件时,它通常会显示为灰色,且不能和用户发生交互操作; closeButton = new QPushButton(tr("Close")); connect(lineEdit,SIGNAL(textChanged(const QString &)), this,SLOT(enableFindButton(const QString &))); //只要行编辑器中的文本发生变化,就会调用私有槽enableFindButton(const QString &)); connect(findButton,SIGNAL(clicked()), this,SLOT(findClicked())); //当用户单击Find按钮时,就会调用私有槽findClicked(); connect(closeButton,SIGNAL(clicked()), this,SLOT(close())); //当用户单击Close按钮时,对话框会关闭; //close()槽从QWidget中继承而来; 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->addStretch(); //窗口部件分隔符,占位使用; rightLayout->addWidget(closeButton); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addLayout(leftLayout); mainLayout->addLayout(rightLayout); setLayout(mainLayout); //主布局; setWindowTitle(tr("Find")); setFixedHeight(sizeHint().height()); //QWidget::sizeHint()函数可以返回一个窗口部件所“理想”的尺寸大小;}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); }}//当用户单击按钮时,就会调用findClicked()槽,而该槽将会发射findPrevious()或findNext()信号,这取决于Search backward选项的取值;//emit是Qt中的关键字,和其它Qt扩展一样,它也会被C++预处理器转换成标准的C++代码;void FindDialog::enableFindButton(const QString &text){ findButton->setEnabled(!text.isEmpty());}//有文字输入,则启用Find按钮,无文字输入,则禁用Find按钮;
在主函数中调用
#include "finddialog.h"#include <QtGui/QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); FindDialog *dialog = new FindDialog; dialog->show(); return a.exec();}
运行结果
阅读全文
0 0
- Qt笔记·第四篇子类化QDialog
- qt学习第四课:子类化窗口
- QT学习笔记之Qdialog
- 第二章 创建对话框 2.1子类化QDialog(1)
- 第二章 创建对话框 2.1子类化QDialog(2)
- qt学习笔记(三)之对话框-QDialog
- QT学习笔记之QWidget,QMainWindow和QDialog的区别
- 3.2 对话框QDialog(1)-->Qt Creater 快速入门(笔记)
- 3.2 对话框QDialog(2)-->Qt Creater 快速入门(笔记)
- qt学习笔记(三)之对话框-QDialog
- Qt学习笔记外观篇(五):子类化窗口部件类
- <Linux+Qt>QDialog
- QT 之QDialog
- qt QDialog去掉标题栏
- Qt常用类QDialog
- Qt代码实现QDialog对象
- Qt QDialog对话框 模态&非模态
- QT:QDialog的设置简述
- window 下出现[14748] 17 Jul 21:15:54.400 # Creating Server TCP listening socket 127.0.0.1:6379: bind: N
- Git的步骤以及命令
- sklearn学习之K近邻算法
- 献给杭电五十周年校庆的礼物 HDU 1290
- CSS中关于定位的那些问题
- Qt笔记·第四篇子类化QDialog
- 工作日报
- Hadoop学习日志1-结构化数据与非结构化数据
- Curl get/post传值
- hibernate之概述,入门案例(配置文件,api)(01)
- 关于hibernate的见解
- 查找数组的相对“平衡点”
- 面向对象
- UE4 PAK热更新