可擴充對話框通常用于使用者對界面有不同要求的場合。通常情況下,隻出現基本對話窗體;當供進階使用者使用或需要更多資訊是,可通過某種方式的切換顯示完整對話窗體(擴充窗體),切換的工作通常由一個按鈕來實作。
可擴充對話框的基本實作方法是利用setSizeConstraint(QLayout::SetFixedSize)方法是對話框尺寸保持相對固定。其中,最關鍵的部分有以下兩點。
本文福利,莬費領取Qt開發學習資料包、技術視訊,内容包括(C++語言基礎,Qt程式設計入門,QT信号與槽機制,QT界面開發-圖像繪制,QT網絡,QT資料庫程式設計,QT項目實戰,QSS,OpenCV,Quick子產品,面試題等等)↓↓↓↓↓↓見下面↓↓文章底部點選莬費領取↓↓
在整個對話框的構造函數中調用。
layout->setSizeConstraint(QLayout::SetFixedSize);
這個設定保證了對話框的尺寸保持相對固定,始終保持各個控件組合的預設尺寸。在擴充部分顯示時,對話框尺寸根據需要顯示的控件被擴充;而在擴充部分影藏時,對話框尺寸又恢複至初始狀态。
切換按鈕的實作。整個窗體可擴充的工作都是在此按鈕所連接配接的槽函數中完成的。
下面通過一個執行個體來說明它的使用:
1、運作結果
2、實作原理
建立兩個Widge,一個基本窗體,一個詳細窗體,都加入到主窗體的布局中,然後将詳細窗體隐藏。當點選了詳細按鈕時,将詳細窗體顯示出來。
3、詳細代碼
extensionDlg.h
#ifndef EXTENSIONDLG_H
#define EXTENSIONDLG_H
#include <QDialog>
class ExtensionDlg : public QDialog
{
Q_OBJECT
public:
ExtensionDlg(QWidget *parent = 0);
~ExtensionDlg();
private slots:
void showDetailInfo();
private:
void createBaseInfo(); //實作基本對話框窗體部分
void createDetailInfo(); //實作擴充窗體部分
QWidget *baseWidget; //基本對話框窗體部分
QWidget *detailWidget; //擴充窗體部分
};
#endif // EXTENSIONDLG_H
extensionDlg.cpp
#include "extensiondlg.h"
#include <QVBoxLayout>
#include <QLineEdit>
#include <QComboBox>
#include <QPushButton>
#include <QDialogButtonBox>
#include <QHBoxLayout>
#include <QLabel>
ExtensionDlg::ExtensionDlg(QWidget *parent)
: QDialog(parent)
{
setWindowTitle(tr("Extension Dialog"));
createBaseInfo();
createDetailInfo();
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(baseWidget);
layout->addWidget(detailWidget);
//設定窗體的大小固定,不能利用拖拽改變大小,否則當再次單擊“詳細”按鈕時,對話框不能恢複到初始狀态
layout->setSizeConstraint(QLayout::SetFixedSize);
layout->setSpacing(10);
}
ExtensionDlg::~ExtensionDlg()
{
}
void ExtensionDlg::createBaseInfo()
{
baseWidget = new QWidget;
QLabel *nameLabel = new QLabel(tr("姓名: "));
QLineEdit *nameLineEdit = new QLineEdit;
QLabel *sexLabel = new QLabel(tr("性别: "));
QComboBox *sexComboBox = new QComboBox;
sexComboBox->insertItem(0,tr("男"));
sexComboBox->insertItem(1,tr("女"));
QGridLayout *LeftLayout = new QGridLayout;
LeftLayout->addWidget(nameLabel,0,0);
LeftLayout->addWidget(nameLineEdit,0,1);
LeftLayout->addWidget(sexLabel);
LeftLayout->addWidget(sexComboBox);
QPushButton *OkBtn = new QPushButton(tr("确定"));
QPushButton *DetailBtn = new QPushButton(tr("詳細"));
QDialogButtonBox *btnBox = new QDialogButtonBox(Qt::Vertical);
btnBox->addButton(OkBtn,QDialogButtonBox::ActionRole);
btnBox->addButton(DetailBtn,QDialogButtonBox::ActionRole);
QHBoxLayout *mainLayout = new QHBoxLayout(baseWidget);
mainLayout->addLayout(LeftLayout);
mainLayout->addWidget(btnBox);
connect(DetailBtn,SIGNAL(clicked(bool)),this,SLOT(showDetailInfo()));
}
void ExtensionDlg::createDetailInfo()
{
detailWidget = new QWidget;
QLabel *ageLabel = new QLabel(tr("年齡: "));
QLineEdit *ageLineEdit = new QLineEdit;
ageLineEdit->setText(tr("30"));
QLabel *departmentLabel = new QLabel(tr("部門: "));
QComboBox *depratmentComboBox = new QComboBox;
depratmentComboBox->addItem(tr("研發部"));
depratmentComboBox->addItem(tr("人事部"));
depratmentComboBox->addItem(tr("财務部"));
depratmentComboBox->addItem(tr("業務部"));
QLabel *emailLabel = new QLabel(tr("Email: "));
QLineEdit *emailLineEdit = new QLineEdit;
QGridLayout *mainLayout = new QGridLayout(detailWidget);
mainLayout->addWidget(ageLabel,0,0);
mainLayout->addWidget(ageLineEdit,0,1);
mainLayout->addWidget(departmentLabel,1,0);
mainLayout->addWidget(depratmentComboBox,1,1);
mainLayout->addWidget(emailLabel,2,0);
mainLayout->addWidget(emailLineEdit,2,1);
detailWidget->hide();
}
void ExtensionDlg::showDetailInfo()
{
if(detailWidget->isHidden())
detailWidget->show();
else
detailWidget->hide();
}
本文福利,莬費領取Qt開發學習資料包、技術視訊,内容包括(C++語言基礎,Qt程式設計入門,QT信号與槽機制,QT界面開發-圖像繪制,QT網絡,QT資料庫程式設計,QT項目實戰,QSS,OpenCV,Quick子產品,面試題等等)↓↓↓↓↓↓見下面↓↓文章底部點選莬費領取↓↓