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控件了