QT的对话框类QDialog实现了对话框的基础,它从QWidget继承,可以提供一个返回值。
创建一个对话框的步骤如下:
- 创建一个从QDialog继承的类。
- 添加对话框中的部件,如按钮等等
- 创建各种需要的消息和槽。
class FindDialog : public QDialog //从QDialog继承一个新的对话框类 { Q_OBJECT public: FindDialog(QWidget *parent = 0); //在构造函数中将对对话框中所用到的部件进行创建初始化等等 signals: void findNext(const QString &str,Qt::CaseSensitivity cs); //定义点击findButton时会发出的两个信号 void findPrevious(const QString &str,Qt::CaseSensitivity cs); private slots: void findClicked(); //当findButton点击时触发槽 void enableFindButton(const QString &text); //当lineEdit发生变坏是触发的槽 private QLabel *label; //添加label QLineEdit *lineEdit; //添加lineEdit QCheckBox *caseCheckBox; //添加caseCheckBox QCheckBox *backwardCheckBox; //添加backwardCheckBox QPushButton *findButton; //添加findButton QPushButton *closeButton; //添加closeButton }
这样一个对话框子类就建立好了,那么该实现了。
首先是在构造函数中创建对话框中的部件并设置,并且设计好部件在窗体中的布局。
FindDialog::FindDialog(QWidget *parent)
{
//tr()的作用之一是从.qm文件中取出与其所包含的内容对应的信息。
label = new QLabel(tr("Find &What:")); //创建label
lineEdit = new QLineEdit; //创建lineEdit
//设置label的伙伴(Buddy),作用:当按下label快捷键时,lineEdit将获取到焦点
label->setBuddy(lineEdit);
caseCheckBox = new QCheckBox; //创建caseCheckBox
findButton = new QPushButton(tr("&Find")); //创建findButton并设置为默认按钮和不可用
findButton->setDefault(true);
findButton->setEnabled(false);
closeButton = new QPushButton(tr("Close"));//创建findButton
//当lineEdit内容发生变化时将触发enableFindButton
connect(lineEdit,SIGNAL(textChanged(const QString &)),
this,SLOT(enableFindButton(const QString & )));
//点击findButton时触发findClicked()
connect(findButton,SIGNAL(clicked()),this,SLOT(findClicked()));
//点击closeButton时,对话框关闭
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()将返回一个理想的高度值
}
接着实现对话框中所用到的槽
void FindDialog::findClicked()
{
QString text = lineEdit->text();
//Qt::CaseSensitivity
Qt::CaseSensitivity cs = caseCheckBox->isChecked() ?
Qt::CaseSensitive : Qt::CaseInsensitive;
//根据选中的CheckBox发射不同的消息。
if(backwardCheckBox->isChecked())
{
emit findPrevious(text,cs);
}
else
{
emit findNext(text,cs);
}
}
//设置根据lineEdit内容设置findButton是否
void FindDialog::enableFindButton(const QString &text)
{
findButton->setEnabled(!text.isEmpty());
}
好了真个对话框类就实现好了,调用来看看~
#include <QApplication>
#include <finddialog.h>
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
FindDialog *dialog = new FindDialog;
dialog->show();
return app.exec();
}
运行如图:
创建对话框的大致步骤就如上面的了。当然也可以通过QT Designer进行可视化的设计对话框后给程序调用。
关于lineEdit:
lineEdit的输入可以通过检验器件来控制输入。如:QIntValidator,QDoubleValidator,QRegExpValidator。
示例:
QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
lineEdit->setValidator(new QRegExpValidator(regExp,this));
这里限定lineEdit输入的第一个字符必须是字母,第二个字符必须是1-9的数字,然后可一个输入0至2个0到9的数字。
感觉这里正则真的很方便哦。以前写代码的时候控制edit数据总会写一堆代码,而QT这里2距代码搞定。。。。