创建对话框
2.1 子类化QDialog
编写一个一个Find对话框
MainDialog.h
#ifndef MAINDIALOG_H #define MAINDIALOG_H #include <qdialog.h> #include <qpushbutton.h> #include <qlabel.h> #include <qlineedit.h> #include <qcheckbox.h> class QPushButton; class Qlabel; class QLineEdit; class QCheckBox; class MainDialog:public QDialog { Q_OBJECT public: MainDialog(QWidget *parent = 0); ~MainDialog(); signals: void findNext(const QString *text,Qt::CaseSensitivity cs); void findPrevious(const QString *text,Qt::CaseSensitivity cs); private slots: void find(); void enableFindButton(const QString &text); private: QLabel *label; QPushButton *findButton; QPushButton *closeButton; QLineEdit *lineEdit; QCheckBox *matchBox; QCheckBox *searchBox; }; #endif // MAINDIALOG_H
MainDialog.h
#include "maindialog.h" #include <QHBoxLayout> #include <QVBoxLayout> MainDialog::MainDialog(QWidget *parent) :QDialog(parent) { label = new QLabel(tr("Find &What")); lineEdit = new QLineEdit(); findButton = new QPushButton(tr("Find")); closeButton = new QPushButton(tr("Close")); matchBox = new QCheckBox(tr("Match &case")); searchBox = new QCheckBox(tr("Search &backward")); label->setBuddy(lineEdit); findButton->setDefault(true); findButton->setEnabled(false); this->connect(lineEdit,SIGNAL(textChanged(QString)),this,SLOT(enableFindButton(const QString &))); this->connect(closeButton,SIGNAL(clicked()),this,SLOT(close())); this->connect(findButton,SIGNAL(clicked()),this,SLOT(find())); QHBoxLayout *hlayout = new QHBoxLayout(); hlayout->addWidget(label); hlayout->addWidget(lineEdit); QVBoxLayout *vlayout1 = new QVBoxLayout(); vlayout1->addLayout(hlayout); vlayout1->addWidget(matchBox); vlayout1->addWidget(searchBox); QVBoxLayout *vlayout2 = new QVBoxLayout(); vlayout2->addWidget(findButton); vlayout2->addWidget(closeButton); vlayout2->addStretch(); QHBoxLayout *mainLayout = new QHBoxLayout(); mainLayout->addLayout(vlayout1); mainLayout->addLayout(vlayout2); setLayout(mainLayout); setWindowTitle(tr("Find")); setFixedHeight(sizeHint().height()); } MainDialog::~MainDialog() { } void MainDialog::enableFindButton(const QString &text) { findButton->setEnabled(!text.isEmpty()); } void MainDialog::find() { QString text = lineEdit->text(); Qt::CaseSensitivity cs = matchBox->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive; if(searchBox->isChecked()) { emit findPrevious(&text,cs); } else { emit findNext(&text,cs); } }
在字符串中,使用“与”操作的符号“&”来表示快捷键。设置行编辑器作为标签的伙伴。所谓的“伙伴”就是一个窗口部件,他可以再按下标签的快捷键时接受焦点。所以当用户按下Alt+W时,焦点就会移动到这个行编辑器上。
通过findButton->setdefault(true)让Find按钮成为对话框的默认按钮。默认按钮(default button)就是当用户按下Enter键时能够按下对应的按钮。findButton->setEnable(false),禁用了Find按钮,当禁用了一个窗口部件时,它通常会显示灰色,并且不能和用户发生交互操作。
在MainDialog中,使用布局管理器包房这些子窗口部件,布局中既可以包含多个窗口部件,也可以包含其他的子布局。通过QHBoxLayout、QVBoxLayout和QGridLayout这三个布局的不同嵌套组合,就可能构造出相当复杂的对话框。在MainDialog中,使用了QHBoxLayout和QVBoxLayout两个布局。外面的布局时主布局,通过setlayout函数将其安装在MainDialog中,并且由其负责对话框的整个区域,其他三个布局则作为子布局。
最后设置在对话框标题栏上显示的标题内容,并让窗口具有一个固定的高度,这是因为在对话框上垂直方向上在没有其它窗口部件可以去占用所多出的空间了。QWidget::sizeHint()函数可以返回一个窗口部件所“理想”的尺寸大小。
当用户点击Find按钮时,就会调用findClicked()槽。则该槽将会发生finPrevious()或findNext()信号,这取决于search backward选项值的取值。emit是Qt中的关键字,想起他Qt扩展一样,他也会被c++预处理器转换成c++代码。
main.cpp
1 #include "maindialog.h" 2 #include <qapplication.h> 3 4 int main(int argc,char *argv[]) 5 { 6 QApplication app(argc,argv); 7 MainDialog *dialog = new MainDialog(); 8 dialog->show(); 9 10 return app.exec(); 11 }