QT_StepByStep(3)--创建一个对话框

  • FINDDIALOG_H 头文件:
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <QtGui/QDialog>
/*声明四个用到的类*/
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
/*首先定义一个派生类QDialog,基类是FindDialog*/
class FindDialog  : public QDialog
{
/*Q_OBJECT 是宏,定义信号槽的类都要声明这个宏*/
Q_OBJECT
/*构造函数和析构函数*/
public:
FindDialog(QWidget  *parent = 0);
~FindDialog();
/*signals,QT关键字,对信号定义.FindDialog 有两个public 的信号,它可以在特定的时刻发出这两个信号,就这里来说,如果用户点击了Find 按钮,并且选中了 Search  backward ,就会发出 findPrevious() ,否则发出findNext()。*/
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
  • FindDialog.cpp 函数:
/*QtGui,它包括了QtCore 和 QtGui 模块。是统称,在正式开发的时候用到哪些组件,使能哪些组件*/
#include <QtGui>
#include "finddialog.h"
/*在类的外面定义派生类狗在函数*/
FindDialog::FindDialog(QWidget  *parent): QDialog(parent)
{
label  = new QLabel(tr("Find  &what:"));
lineEdit  = new QLineEdit;
label ->setBuddy(lineEdit);
/*创建了两个 QCheckBox,把默认的按钮设为 findButton,把 findButton 设为不可用——也就是变成灰色的了。*/
 
caseCheckBox = new QCheckBox(tr("Match &case"));
backwardCheckBox = new QCheckBox(tr("Search &backford"));
findButton = new QPushButton(tr("&Find"));
findButton->setDefault(true);
findButton->setEnabled(false);
closeButton = new QPushButton(tr("Close"));
/*connect 语句,用来连接信号槽,当 lineEdit 发出textChanged(const  QString&) 信 号 时, FindDialog 的 enableFindButton(const QString&)函数会被调用。

注意,connect()函数也是 QObject 的,因为我们继承了 QObject,所以能够直接使用。

*/
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());
//设置对话框高度,这里调用sizeHint().height())函数为最理想高度
}
 
/*槽函数*/
FindDialog::~FindDialog()
{
}
/*槽函数,首先取出 lineEdit 的输入值;然后判断 caseCheckBox是不是选中。如果 backwardCheckBox 被选中,就 emit(发出)信号 findPrevious(),否则 emit 信号 findNext。*/
void FindDialog::findClicked()
{
QString text = lineEdit->text();
Qt::CaseSensitivity  cs  =  caseCheckBox->isChecked()  ?  Qt::CaseInsensitive  : Qt::CaseSensitive;
if(backwardCheckBox->isChecked()) {
    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();
}
posted @ 2015-05-26 17:34  不二侬  阅读(255)  评论(0编辑  收藏  举报