喝着一杯咖啡

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

我们的目的是创建一个比较丰富的Dialog。

准备3个文件, finddialog.h,finddialog.cpp,main.cpp

ffinddialog.h

 1 #ifndef FINDDIALOG_H
 2 #define FINDDIALOG_H
 3 #include <QDialog>                                

 4class QCheckBox;
 5class QLabel;
 6class QLineEdit;
 7class QPushButton;
 8class FindDialog:public QDialog
 9{
10    Q_OBJECT
11public:
12    FindDialog(QWidget *parent=0);
13signals:
14void findext(const QString &str,Qt::CaseSensitivity cs);
15void findePrevious(const QString &str,Qt::CaseSensitivity cs);
16private slots:
17void findClicked();
18void enableFindButton(const QString &text);
1920private:
21    QLabel *label;
22    QLineEdit *lineEdit;
23    QCheckBox *caseCheckBox;
24    QCheckBox *backwardCheckBox;
25    QPushButton *findButton;
26    QPushButton *closeButton;
2728};
29#endif30

 

 第10 行,Q_OBJECT 是一个宏定义,如果类里面用到了signal 或者slots,就要声明这个宏。

第12 行, FindDialog(QWidget *parent = 0);构造函数是Qt 控件类的标准格式,默认的

父参数为NULL,说明没有父控件。

第13 行,signal 声明了这个对话框发出的两个信号,如果选择向前查找,那么对话框就发出

findPrevious()信号,否则,发出findNext()信号。signal 也是一个宏,在编译之前,C++预

处理把它变成标准的c++代码。Qt::CaseSensitivity 是一个枚举类型,有Qt::CaseSensitive

和Qt::CaseInsensitive 两个值。

在类的私有部分,声明有两个slot 函数。为了实现这两个函数,需要用到对话框的其他控件的

信息,所以保存了一些控件的指针。slot 关键字和signal 一样,也是一个宏。

对于私有成员变量,我们只是使用了它们的指针,没有对它们进行存取操作,编译器不需要知道

它们的详细定义,所以只使用了这些类的前向声明。当然,也可以使用<QCheckBox>,

<QLabel>等,但是,使用前向声明会让编译速度更快一些。

 

 finddialog.cpp

 1 #include <QtGui>
 2 #include"finddialog.h"
 3 FindDialog::FindDialog(QWidget *parent):QDialog(parent)
 4 {
 5     label=new QLabel(tr("Find &what:"));
 6     lineEdit=new QLineEdit;
 7     label->setBuddy(lineEdit);
 8     caseCheckBox=new QCheckBox(tr("Match &case"));
 9     backwardCheckBox=new QCheckBox(tr("Search &backward"));
10     findButton=new QPushButton(tr("&Find"));
11     findButton->setDefault(true);
12     findButton->setEnabled(false);
13     closeButton=new QPushButton(tr("Close"));
14     connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(enableFindButton(const QString &)));
15     connect(findButton,SIGNAL(clicked()),this,SLOT(findClicked()));
16     connect(closeButton,SIGNAL(clicked()),this,SLOT(close()));
17     QHBoxLayout *topLeftLayout=new QHBoxLayout();
18     topLeftLayout->addWidget(label);
19     topLeftLayout->addWidget(lineEdit);
20     QVBoxLayout *leftLayout=new QVBoxLayout();
21     leftLayout->addLayout(topLeftLayout);
22     leftLayout->addWidget(caseCheckBox);
23     leftLayout->addWidget(backwardCheckBox);
24     QVBoxLayout *rightLayout=new QVBoxLayout();
25     rightLayout->addWidget(findButton);
26     rightLayout->addWidget(closeButton);
27     rightLayout->addStretch();
28     QHBoxLayout *mainLayout=new QHBoxLayout();
29     mainLayout->addLayout(leftLayout);
30     mainLayout->addLayout(rightLayout);
31     setLayout(mainLayout);
32     setWindowTitle(tr("Find"));
33     setFixedHeight(sizeHint().height());
34 
35 
36 }
37 
38 void FindDialog::findClicked()
39     {
40         QString text=lineEdit->text();
41         Qt::CaseSensitivity cs=caseCheckBox->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive;
42         if(backwardCheckBox->isChecked()){
43             emit findePrevious(text,cs);
44 
45         }else{
46             emit findext(text,cs);
47         }
48     }
49 
50     void FindDialog::enableFindButton(const QString &text)
51     {
52         findButton->setEnabled(!text.isEmpty());
53 
54     }
55 

 

 当用户点击findButton 按钮,findClicked()就会调用,根据backwardCheckBox 状态,他

发出findPrevious()或者findNext()信号。emit 也是一个Qt 的宏。

当用户改变lineEdit 中的文本,enableFindButton()slot 函数就会调用。如果输入了文本,那

么让findButton 有效,否则就无效。

当父控件没销毁qt会自动销毁所有子控件 

 

main.cpp

 

1     QApplication app(argc,argv);
2     FindDialog *dialog=new FindDialog();
3     dialog->show();
4     return app.exec();

 

 。Qt 有三个主要的布局管理器:

QHBoxLayout:水平排列控件。

QVBoxLayout:垂直排列控件。

QGridLayout:按矩阵方式排列控件

 

posted on 2010-01-27 15:27  喝着一杯咖啡  阅读(518)  评论(0编辑  收藏  举报