最近学习Qt时设计了一个简单的查找对话框,大致界面如下:
当用户输入查找目标,按下查找按钮后,对话框会发射一个信号,信号中包含着查找目标,反向查找标志,匹配大小写标志等关键信息。
代码如下:
//下面是QFindDialog的头文件
#ifndef __QFINDDIALOG_H__
#define __QFINDDIALOG_H__
#include <QDialog>
#include <QCheckBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDebug>
class QFindDialog : public QDialog
{
Q_OBJECT
protected:
QLabel *label;
QLineEdit *lineEdit;
QGroupBox *groupBox;
QCheckBox *caseCheckBox;
QCheckBox *backwardCheckBox;
QPushButton *findButton;
QPushButton *closeButton;
signals:
void clicked(const QString &str, Qt::CaseSensitivity cs, bool direct);
protected slots:
void onTextChanged(const QString &text);
void onClickedFindButton();
protected:
QFindDialog(QWidget *parent = NULL);
bool construct();
bool initFindDialog();
bool initLeftLayout(QHBoxLayout *layout);
bool initGroupBox();
bool initRightLayout(QHBoxLayout *layout);
public:
static QFindDialog* NewInstance(QWidget *parent = NULL);
virtual ~QFindDialog();
};
#endif
//下面是QFindDialog的实现文件
#include "QFindDialog.h"
void QFindDialog::onTextChanged(const QString &text)
{
findButton->setEnabled(!text.isEmpty());
}
void QFindDialog::onClickedFindButton()
{
emit clicked(lineEdit->text(), caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive, !backwardCheckBox->isChecked());
}
QFindDialog::QFindDialog(QWidget *parent) : QDialog(parent)
{
label = NULL;
lineEdit = NULL;
groupBox = NULL;
caseCheckBox = NULL;
backwardCheckBox = NULL;
findButton = NULL;
closeButton = NULL;
setWindowTitle("查找");
resize(500, 250);
}
bool QFindDialog::construct()
{
bool ret = true;
ret = ret && (label = new QLabel(this));
ret = ret && (lineEdit = new QLineEdit(this));
ret = ret && (groupBox = new QGroupBox(this));
ret = ret && (caseCheckBox = new QCheckBox(this));
ret = ret && (backwardCheckBox = new QCheckBox(this));
ret = ret && (findButton = new QPushButton(this));
ret = ret && (closeButton = new QPushButton(this));
if(ret)
{
label->setText("查找目标(&F):");
label->setBuddy(lineEdit);
lineEdit->clear();
connect(lineEdit, SIGNAL(textChanged(QString)), this, SLOT(onTextChanged(QString)));
ret = ret && initGroupBox();
caseCheckBox->setText("匹配大小写");
caseCheckBox->setChecked(true);
backwardCheckBox->setText("反向查找");
backwardCheckBox->setChecked(false);
findButton->setText("查找");
findButton->setDefault(true);
findButton->setEnabled(false);
connect(findButton, SIGNAL(clicked()), this, SLOT(onClickedFindButton()));
closeButton->setText("关闭");
connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
ret = ret && initFindDialog();
}
return ret;
}
bool QFindDialog::initFindDialog()
{
bool ret = true;
QHBoxLayout *topLayout = new QHBoxLayout();
ret = ret && topLayout;
if(ret)
{
topLayout->setSpacing(4);
//topLayout->setParent(this);
ret = ret && initLeftLayout(topLayout);
ret = ret && initRightLayout(topLayout);
setLayout(topLayout);
//qDebug() << "topLayout->parent = " << topLayout->parent();
}
return ret;
}
bool QFindDialog::initLeftLayout(QHBoxLayout *layout)
{
bool ret = true;
QVBoxLayout *leftLayout = NULL;
QHBoxLayout *hLayout = NULL;
ret = ret && (leftLayout = new QVBoxLayout());
ret = ret && (hLayout = new QHBoxLayout());
if(ret)
{
leftLayout->setSpacing(4);
//leftLayout->setParent(layout);
hLayout->setSpacing(4);
//hLayout->setParent(leftLayout);
hLayout->addWidget(label, 1, Qt::AlignCenter);
hLayout->addWidget(lineEdit, 1, Qt::AlignCenter);
leftLayout->addLayout(hLayout, 1);
leftLayout->addWidget(groupBox, 2);
layout->addLayout(leftLayout, 1);
//qDebug() << "leftLayout->parent = " << leftLayout->parent();
}
return ret;
}
bool QFindDialog::initGroupBox()
{
bool ret = true;
QVBoxLayout *vLayout = new QVBoxLayout();
ret = ret && vLayout;
if(ret)
{
vLayout->setSpacing(4);
vLayout->setContentsMargins(20, 0, 20, 0);
vLayout->addWidget(backwardCheckBox, 1, Qt::AlignLeft);
vLayout->addWidget(caseCheckBox, 1, Qt::AlignLeft);
groupBox->setLayout(vLayout);
}
return ret;
}
bool QFindDialog::initRightLayout(QHBoxLayout *layout)
{
bool ret = true;
QVBoxLayout *rightLayout = new QVBoxLayout();
ret = ret && rightLayout;
if(ret)
{
rightLayout->setSpacing(4);
//rightLayout->setParent(layout);
rightLayout->addWidget(findButton, 1, Qt::AlignCenter);
rightLayout->addWidget(closeButton, 1, Qt::AlignCenter);
rightLayout->addStretch(5);
layout->addLayout(rightLayout, 1);
}
return ret;
}
QFindDialog* QFindDialog::NewInstance(QWidget *parent)
{
QFindDialog *ret = new QFindDialog(parent);
if(ret == NULL || !ret->construct())
{
delete ret;
ret = NULL;
}
return ret;
}
QFindDialog::~QFindDialog()
{
}