Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
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, 00);
    mainLayout
->addWidget(buttonBox, 01);
    mainLayout
->addWidget(extension, 10);
    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控件了
posted on 2011-03-17 20:55 ccsdu2009 阅读(1497) 评论(0)  编辑 收藏 引用 所属分类: QT编程

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理