天天看點

SubClassing QDialog

#ifndef FINDDIALOG_H

#define FINDDIALOG_H

#include<QDialog>

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

    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

#include<QtGui>

#include"findDialog.h"

FindDialog::FindDialog(QWidget *parent) : QDialog(parent)

{

    label = new QLabel(tr("Find &what"));

    lineEdit = new QLineEdit;

    label->setBuddy(lineEdit);

    caseCheckBox = new QCheckBox(tr("Match &case"));

    backwardCheckBox = new QCheckBox(tr("Search &backward"));

    findButton = new QPushButton(tr("&Find"));

    findButton->setDefault(true);

    findButton->setEnabled(false);

    closeButton = new QPushButton(tr("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()));

    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->addWidget(closeButton);

    rightLayout->addStretch();

    QHBoxLayout *mainLayout = new QHBoxLayout;

    mainLayout->addLayout(leftLayout);

    mainLayout->addLayout(rightLayout);

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

    }

    else

    {

        emit findNext(text, cs);

    }

}

void FindDialog::enableFindButton(const QString &text)

{

    findButton->setEnabled(!text.isEmpty());

}