天天看點

Qt可擴充對話框1、運作結果2、實作原理3、詳細代碼

可擴充對話框通常用于使用者對界面有不同要求的場合。通常情況下,隻出現基本對話窗體;當供進階使用者使用或需要更多資訊是,可通過某種方式的切換顯示完整對話窗體(擴充窗體),切換的工作通常由一個按鈕來實作。

可擴充對話框的基本實作方法是利用​​setSizeConstraint(QLayout::SetFixedSize)​​方法是對話框尺寸保持相對固定。其中,最關鍵的部分有以下兩點。

本文福利,莬費領取Qt開發學習資料包、技術視訊,内容包括(C++語言基礎,Qt程式設計入門,QT信号與槽機制,QT界面開發-圖像繪制,QT網絡,QT資料庫程式設計,QT項目實戰,QSS,OpenCV,Quick子產品,面試題等等)↓↓↓↓↓↓見下面↓↓文章底部點選莬費領取↓↓

在整個對話框的構造函數中調用。

layout->setSizeConstraint(QLayout::SetFixedSize);
           

這個設定保證了對話框的尺寸保持相對固定,始終保持各個控件組合的預設尺寸。在擴充部分顯示時,對話框尺寸根據需要顯示的控件被擴充;而在擴充部分影藏時,對話框尺寸又恢複至初始狀态。

切換按鈕的實作。整個窗體可擴充的工作都是在此按鈕所連接配接的槽函數中完成的。

下面通過一個執行個體來說明它的使用:

1、運作結果

Qt可擴充對話框1、運作結果2、實作原理3、詳細代碼
Qt可擴充對話框1、運作結果2、實作原理3、詳細代碼

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子產品,面試題等等)↓↓↓↓↓↓見下面↓↓文章底部點選莬費領取↓↓

繼續閱讀