可扩展对话框,无非就是扩展部分的隐藏与显示,通过按钮点击来切换扩展部分的状态
有个重要点需要注意:
主窗口的layout需要设置固定大小,也就是
layout->setSizeConstraint(QLayout::SetFixedSize);
如果没有设置固定大小,那么窗口从第一次扩展后,收回扩展部分将不会缩小窗口
设置了固定大小的效果 没有设置的效果
贴一下代码:
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
#include <QWidget>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
void initFirstWidget();
void initExtensionWidget();
private slots:
void showExtensionWidget();
private:
QWidget * firstWidget;
QWidget * extensionWidget;
};
#include "widget.h"
#include <QtWidgets>
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
initFirstWidget();
initExtensionWidget();
QVBoxLayout * layout = new QVBoxLayout(this);
//重点!可扩展对话框最关键部分
layout->setSizeConstraint(QLayout::SetFixedSize);
layout->addWidget(firstWidget);
layout->addWidget(extensionWidget);
setLayout(layout);
}
Widget::~Widget()
{
}
void Widget::initFirstWidget()
{
firstWidget = new QWidget;
firstWidget->setFixedSize(200, 50);
QPushButton * extensionBtn = new QPushButton(firstWidget);
extensionBtn->setText("详细信息...");
QHBoxLayout * layout = new QHBoxLayout(firstWidget);
layout->addStretch(1);
layout->addWidget(extensionBtn);
connect(extensionBtn, SIGNAL(clicked(bool)), this, SLOT(showExtensionWidget()));
firstWidget->setLayout(layout);
}
void Widget::initExtensionWidget()
{
extensionWidget = new QWidget;
extensionWidget->setFixedSize(200, 100);
QTextEdit * textEdit = new QTextEdit(extensionWidget);
QPushButton * exitBtn = new QPushButton(extensionWidget);
exitBtn->setText("退出");
QHBoxLayout * btnLayout = new QHBoxLayout;
btnLayout->addStretch(1);
btnLayout->addWidget(exitBtn);
QVBoxLayout * layout = new QVBoxLayout(extensionWidget);
layout->addWidget(textEdit);
layout->addLayout(btnLayout);
connect(exitBtn, SIGNAL(clicked(bool)), this, SLOT(close()));
extensionWidget->setLayout(layout);
extensionWidget->hide(); //隐藏控件
}
void Widget::showExtensionWidget()
{
if(extensionWidget->isHidden()){
extensionWidget->show();
}else{
extensionWidget->hide();
}
}