QT学习 之 对话框 (一) 可扩展对话框

QT中的对话框是QDialog类

下面是三个主要的窗口的区别:

QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。 

QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围 菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态条变得更容易,当用户点击菜单项或者工具条按钮时,槽会被调用。

QDialog类是对话框窗口的基类。对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。QDialog可以是模态对话框也可以是非模态对话框。QDialog支持扩展性并且可以提供返回值。它们可以有默认按钮。QDialog也可以有一个QSizeGrip在它的右下角,使用setSizeGripEnabled()。 

QDialog 是最普通的顶级窗口。一个不会被嵌入到父窗口部件的窗口部件叫做顶级窗口部件。通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口。

如果是顶级对话框,那就基于QDialog创建,如果是主窗体,那就基于QMainWindow,如果不确定,或者有可能作为顶级窗体,或有可能嵌入到其他窗体中,则基于QWidget创建。
当然了,实际中,你还可以基于任何其他部件类来派生。看实际需求了,比如QFrame、QStackedWidget等等。


extension.h头文件

<span style="font-size:18px;">#ifndef EXTENSION_H
#define EXTENSION_H
#include <QApplication>
#include <QPushButton>
#include <QDialog>
#include <QGridLayout>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QDialogButtonBox>
#include <QGridLayout>
#include <QDialog>
#include <QtGui>

class Extension : public QDialog
{
    Q_OBJECT
public:
    Extension(QWidget *parent=0);
    void createBaseInfo();
    void createDetailInfo();
public slots:
    void slotExtension();
private:
    QWidget *baseWidget;
    QWidget *detailWidget;

};

#endif // EXTENSION_H
</span>


extension.cpp


QComboBOX:下拉列表框

常用方法和属性:

(1)addItems

void addItems ( const QStringList & texts )

在QComboBox的最后添加一项。

(2)count

int count () const

返回列表项总数。

(3)currentIndex

int currentIndex () const

当前显示的列表项序号。

(4)currentText

QString currentText () const

返回当前显示的文本。

(5)insertItem

void insertItem ( int index, const QString & text, const QVariant & userData = QVariant() )

void insertItem ( int index, const QIcon & icon, const QString & text, const QVariant & userData = QVariant() )

void insertItems ( int index, const QStringList & list )

插入一项或多项至序号index处。
(6)insertSeparator

void insertSeparator ( int index )

在序号为index的项前插入分隔线

(7)setItemText

void setItemText ( int index, const QString & text )

改变序号为index项的文本。



QDialogButtonBox:用于创建一个符合当前窗口部件样式的一组按钮,并且它们被排列在某种布局之中。

在QtDesigner中,最为常见的用法是从窗口部件盒里面把默认的那个QDialogButtonBox窗口部件拖到界面上来,不过显然这并不如使用代码来得方便。 


<span style="font-size:18px;">#include "extension.h"

Extension::Extension(QWidget *parent):QDialog(parent)
{
    setWindowTitle(tr("Extension Dialog"));

    createBaseInfo();
    createDetailInfo();

    QVBoxLayout *layout=new QVBoxLayout;
    layout->addWidget(baseWidget);
    layout->addWidget(detailWidget);
    layout->setSizeConstraint(QLayout::SetFixedSize);
    layout->setSpacing(10);
    setLayout(layout);

}


void Extension::createBaseInfo()
{
    baseWidget=new QWidget;

    QLabel *nameLabel = new QLabel(tr("Name:"));
    QLineEdit *nameEdit = new QLineEdit;
    QLabel *sexLabel = new QLabel(tr("Sex:"));
    QComboBox *sexComboBox = new QComboBox;
    sexComboBox->addItem("male");
    sexComboBox->addItem("female");


    QPushButton *okButton = new QPushButton(tr("OK"));
    QPushButton *detailButton = new QPushButton(tr("Detail"));
    connect(detailButton,SIGNAL(clicked()),this,SLOT(slotExtension()));


    QDialogButtonBox *btnBox = new QDialogButtonBox(Qt::Vertical);
    btnBox->addButton(okButton,QDialogButtonBox::ActionRole);
    btnBox->addButton(detailButton,QDialogButtonBox::ActionRole);


    QGridLayout *gride = new QGridLayout;
    gride->addWidget(nameLabel,0,0);
    gride->addWidget(sexLabel,1,0);
    gride->addWidget(nameEdit,0,1);
    gride->addWidget(sexComboBox,1,1);


    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addLayout(gride);
    hbox->addStretch();
    hbox->addWidget(btnBox);
    baseWidget->setLayout(hbox);


}

void Extension::createDetailInfo()
{
    detailWidget = new QWidget;

    QLabel *label1 = new QLabel(tr("Age"));
    QLineEdit *ageEdit = new QLineEdit;
    ageEdit->setText("30");
    QLabel *label2 = new QLabel(tr("Department"));
    QComboBox *deptComboBox = new QComboBox;
    deptComboBox->addItem(tr("dept 1"));
    deptComboBox->addItem(tr("dept 2"));
    deptComboBox->addItem(tr("dept 3"));
    deptComboBox->addItem(tr("dept 4"));
    QLabel *label3 = new QLabel(tr("email:"));
    QLineEdit *edit = new QLineEdit;


    QGridLayout *grid = new QGridLayout;
    grid->addWidget(label1,0,0);
    grid->addWidget(ageEdit,0,1);
    grid->addWidget(label2,1,0);
    grid->addWidget(deptComboBox,1,1);
    grid->addWidget(label3,2,0);
    grid->addWidget(edit,2,1);

    detailWidget->setLayout(grid);

    detailWidget->hide();

}


void Extension::slotExtension()
{
    if(detailWidget->isHidden())
    {
        detailWidget->show();
    }
    else
    {
        detailWidget->hide();
    }
}
</span>


main.cpp

<span style="font-size:18px;">#include<QApplication>
#include"extension.h"

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    Extension exten;
    exten.show();
    return app.exec();
}
</span>



你可能感兴趣的:(QT学习 之 对话框 (一) 可扩展对话框)