QT学习笔记-8.查找文件对话框
只所以选择这个QT自带的例子有2个原因
1是界面简单容易理解
2是当点击more按键会动态改变窗体出现高级选项(我想知道这个是如何做到的)
基本代码如下:
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
class QCheckBox;
class QDialogButtonBox;
class QGroupBox;
class QLabel;
class QLineEdit;
class QPushButton;
QT_END_NAMESPACE
class FindDialog : public QDialog
{
Q_OBJECT
public:
FindDialog(QWidget *parent = 0);
private:
QLabel *label;
QLineEdit *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *fromStartCheckBox;
QCheckBox *wholeWordsCheckBox;
QCheckBox *searchSelectionCheckBox;
QCheckBox *backwardCheckBox;
QDialogButtonBox *buttonBox;
QPushButton *findButton;
QPushButton *moreButton;
QWidget *extension;
};
#endif
.cpp
#include <QtGui>
#include "finddialog.h"
FindDialog::FindDialog(QWidget *parent)
: QDialog(parent)
{
label = new QLabel(tr("Find &what:"));
lineEdit = new QLineEdit;
//! 这个成员函数的作用是当点击控件快捷键则把响应发送到Buddy控件
label->setBuddy(lineEdit);
caseCheckBox = new QCheckBox(tr("Match &case"));
fromStartCheckBox = new QCheckBox(tr("Search from &start"));
fromStartCheckBox->setChecked(true);
findButton = new QPushButton(tr("&Find"));
findButton->setDefault(true);
moreButton = new QPushButton(tr("&More"));
moreButton->setCheckable(true);
//moreButton->setAutoDefault(false);
//! 又是对话框按钮盒,不过这次使用和上次有点区别 其子按钮是加上去的
buttonBox = new QDialogButtonBox(Qt::Vertical);
buttonBox->addButton(findButton, QDialogButtonBox::ActionRole);
buttonBox->addButton(moreButton, QDialogButtonBox::ActionRole);
extension = new QWidget;
wholeWordsCheckBox = new QCheckBox(tr("&Whole words"));
backwardCheckBox = new QCheckBox(tr("Search &backward"));
searchSelectionCheckBox = new QCheckBox(tr("Search se&lection"));
//! 绑定时间(需要注意的是SINGLA,SLOT中的函数必须是形式完备的)
connect(moreButton, SIGNAL(toggled(bool)), extension, SLOT(setVisible(bool)));
//! 扩展控件部分(使用QVBox布局)
QVBoxLayout *extensionLayout = new QVBoxLayout;
extensionLayout->setMargin(0);
extensionLayout->addWidget(wholeWordsCheckBox);
extensionLayout->addWidget(backwardCheckBox);
extensionLayout->addWidget(searchSelectionCheckBox);
extension->setLayout(extensionLayout);
//! 文本框和搜索键
QHBoxLayout *topLeftLayout = new QHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);
//! 辅助控件组
QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(fromStartCheckBox);
leftLayout->addStretch(1);
//! 主布局使用格子管理器
QGridLayout *mainLayout = new QGridLayout;
//! 设置大小不能更改
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
//! 把LeftLayout管理器放在左上角即0,0位置处
mainLayout->addLayout(leftLayout, 0, 0);
mainLayout->addWidget(buttonBox, 0, 1);
mainLayout->addWidget(extension, 1, 0);
setLayout(mainLayout);
setWindowTitle(tr("Extension"));
extension->setVisible(false);
}
需要说明的是
#include <QtGui>是包含所有的GUI控件头文件
我们不再需要
#include <QLabel>
#include <QEdit>
不过看看代码还真应了那句话复杂界面都是布局管理器堆积出来的
另外注意这句话
mainLayout->addWidget(extension, 1, 0);
把extension放在格子管理器的1,0位置
如果注销掉这句话可以看看出来的界面是什么样子的
最后要说的就是extension->setVisible(false);
在开始我们把exntension控件设置为隐藏状态
当然也可以使用函数hide().
由于之前绑定了more按键和extension,
我们就可以通过点击more按键来显示和隐藏extension控件了