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();}

运行结果

这里写图片描述

原创粉丝点击