创建对话框

来源:互联网 发布:2017达内网络视频课程 编辑:程序博客网 时间:2024/06/05 05:02

2.1 子类化QDialog

finddialog.h

//防止对头文件的多重包含#ifndef _FINDDIALOG_H_#define _FINDDIALOG_H_//QDialog是基类#include <QDialog>//前向声明 只能使用指针或者引用//不用包含类定义中的所有细节//但是分配空间时必须在finddialog.cpp中进行定义class QCheckBox;class QLabel;class QLineEdit;class QPushButton;//QDialog是基类 继承自QWidget//QLineEdit与QDialog是同等地位//FindDialog是QDialog的子类class FindDialog:public QDialog{    //定义了信号和槽的类 必须使用 Q_OBJECT    Q_OBJECTpublic:    //构造函数,parent为父窗口,参数默认值是一个空指针    //意味着没有父对象    FindDialog(QWidget *parent = 0);signals:    //Qt::CaseSensitivity表示匹配的灵敏度 是否区分大小写    //signals部分表明点击Find按钮所发射的信号    //Qt::CaseSensitivity是一个枚举类型    //Qt::casesensitive qt::caseInsensitive    void findNext(const QString &str,Qt::CaseSensitivity cs);    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.cpp

//包含了Qt GUI类的定义 如:QLabel#include <QtGui>#include "finddialog.h"FindDialog::FindDialog(QWidget *parent)    :QDialog(parent){    label = new QLabel(tr("Find &what:"));    lineEdit = new QLineEdit();    //将Lineedit设置为label的伙伴 焦点。    label->setBuddy(lineEdit);    caseCheckBox = new QCheckBox(tr("Match &case"));    backwardCheckBox = new QCheckBox(tr("Search &backard"));    findButton = new QPushButton(tr("&Find"));    //成为对话框的默认按钮 按下'enter'时候能够按下对应按钮    findButton->setDefault(true);    //不可编辑    findButton->setEnabled(false);    closeButton = new QPushButton(tr("Close"));    //由于Qobject是FindDialog的父对象 所以可以省去前缀    connect(lineEdit,SIGNAL(textChanged(const QString &)),            this,SLOT(enableFindButton(const QString &)));    connect(findButton,SIGNAL(click()),            this,SLOT(findClicked()));    connect(closeButton,SIGNAL(clicked()),            this,SLOT(close()));    //设置布局    //布局管理器类的精妙之处在于他们不是窗口部件    //所以能很好的区分窗口部件和布局    //当子布局对象添加到父布局对象中,能够自动重定义自己的父对象    QHBoxLayout *topLeftLayout = new QHBoxLayout;    topLeftLayout->addWidget(label);    topLeftLayout->addWidget(lineEdit);    QVBoxLayout *leftLayout = new QVBoxLayout;    //注意 是addLayout    leftLayout->addLayout(topLeftLayout);    leftLayout->addWidget(caseCheckBox);    leftLayout->addWidget(backwardCheckBox);    QVBoxLayout *rightLayout = new QVBoxLayout;    rightLayout->addWidget(findButton);    rightLayout->addWidget(closeButton);    //stretch分隔符    rightLayout->addStretch();    QHBoxLayout *mainLayout = new QHBoxLayout;    mainLayout->addLayout(leftLayout);    mainLayout->addLayout(rightLayout);    setLayout(mainLayout);    setWindowTitle(tr("Find"));    //sizehint返回一个理想的高度    setFixedHeight(sizeHint().height());}//没必要写析构函数 因为删除父对象的同时会删除所有的子对象void FindDialog::findClicked(){    QString text = lineEdit->text();    Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive                                                       : Qt::CaseInsensitive;    if(backwardCheckBox->isChecked())    {        //emit是qt关键字,会被预处理为标准的c++代码        emit findPrevious(text,cs);    }    else    {        emit findNext(text,cs);    }}void FindDialog::enableFindButton(const QString &text){    //不空的话    findButton->setEnabled(!text.isEmpty());}

main.cpp

#include <QApplication>#include "finddialog.h"int main(int argc, char *argv[]){    QApplication app(argc,argv);    FindDialog *dialog = new FindDialog;    dialog->show();    return app.exec();}

2.2 深入介绍信号和槽

槽和普通的C++成员函数是一样的——可以是虚函数;可以被重载,也可以是私有的、公有的、或者是保护的

并且可以被其他c++成员函数直接调用

注:

1、一个信号可以连接多个槽  但是发射信号的时候会以不确定的顺序一个接一个地调用这些槽

2、多个信号可以连接同一个槽

3、一个信号还可以与另一个信号想连接

connect(lineEdit,SIGNAL(),this,SIGNAL())

4、连接可以被移除

disconnect(lcd,SIGNAL(),this,SLOT())

//很少用到,因为当删除对象时, 会自动移除和这个对象相关的所有连接


要把信号成功连接到槽或者是另外一个信号,她们的参数必须有相同的顺序和相同的类型。 如果参数较多,则会被忽略掉

信号和槽不仅仅只是在窗口部件中可以用,这个机制是在QObject中实现的,可以用于QObject的子类中 例如

class Employee:public QObject{    Q_OBJECT    public:    Employee()    {        mySlary = 0;    }    int salary()const    {        return mySalary;    }public slots:    void setSalary(int newSalary);    signals:    void salaryChanged(int newSalary);private:    int mySalary;};void Employee::setSalary(int newSalary){    //只有在newSalary != mySalary的时候猜发射信号    //确保循环连接不会导致无限循环    if( newSalary!= mySalary)    {        mySalary = newSalary;        emit salaryChanged(mySalary);    }}



















0 0
原创粉丝点击