今天又学了第二章,手工完成了一个查找对话框(Find Dialog)。下面贴出代码与大家共享哈。
代码如下:
1.finddialog.h
#ifndef FINDDIALOG_
#define FINDDIALOG_
#include <QDialog>
class QCheckBox; //多选框
class QLabel; //文本条
class QLineEdit; //行编辑器
class QPushButton; //按钮
class FindDialog:public QDialog
{
Q_OBJECT //只要该类中包含槽函数和信号,就要加这个宏
public:
FindDialog(QWidget *parent = 0);
signals:
void findNext(const QString &str, Qt::CaseSensitivity cs); //向后查找信号
void findPrevious(const QString &str, Qt::CaseSensitivity cs);//向前查找信号
private slots:
void findClicked(); //find 按钮点击后使用这个槽处理clicked()信号
void enableFindButton(const QString &text); //当行编辑器中有文字后用该槽使 find 按钮可以按下
private: //声明 find dialog 所需的各个组件
QLabel label;
QLineEdit lineEdit;
QCheckBox backwardCheckBox;
QCheckBox caseCheckBox;
QPushButton findButton;
QPushButton closeButton;
};
#endif
2.finddialog.cpp
#include <QtGui> //包含所有的可视化组件头文件
#include “finddialog.h”
FindDialog::FindDialog(QWidget *parent)
: QDialog(parent)
{
//创建各个组件
label = new QLabel(tr(“Find &what:”));
lineEdit = new QLineEdit;
label->setBuddy(lineEdit);
caseCheckBox = new QCheckBox(tr(“Match &case”));
backwardCheckBox = new QCheckBox(tr(“Search &backward”));
findButton = new QPushButton(tr(“&Find”));
findButton->setDefault(true); //使得find 按钮成为默认按钮
findButton->setEnabled(false); //使得 find 按钮不能按下
closeButton = new QPushButton(tr(“&Quit”));
//用信号与槽连接find按钮和行编辑器。当行编辑器有文字后,使得按钮能够按下
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);
QHBoxLayout *Layout = new QHBoxLayout;
Layout->addLayout(leftLayout);
Layout->addLayout(rightLayout);
setLayout(Layout);//设置窗口布局
setWindowTitle(“Find Dialog”);//设置窗口标题
setFixedHeight(sizeHint().height());//设置窗口理想大小
}
void FindDialog::findClicked() //槽函数实现
{
QString text = lineEdit->text();
Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;
if(backwardCheckBox->isChecked())
emit findPrevious(text, cs); //根据case多选框是否勾选来选择发送findPrevious信号还是findNext信号
else
emit findNext(text, cs);
}
void FindDialog::enableFindButton(const QString &text)
{
findButton->setEnabled(!text.isEmpty()); //如果行编辑器有文字,则使能find按钮
}
3.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();
}
这三个函数就完成了查找窗口的实现。比较简单的。嘿嘿