窗体的sizeConstraint 属性设成QLayout::SetFixedSize,使得窗体对用户"大小非可调",并且其子Widget 在显示和隐藏的时侯窗体大小会自动调整,保证窗体以最合适的尺寸显示。
源码下载地址:
http://cid-620792b9d0909341.skydrive.live.com/self.aspx/.Public/src/Shape-Changing%20Dialogs.rar
新建sortdialog.ui
三个Push Button
两个label,两个Combobox,一个Horizontal Spacer
第一个Push Button 的objectName 属性设为"okButton" ,default 属性设为"true",text 属性设为"ok"
第二个Push Button 的objectName 属性设为"cancelButton",text 属性设为"cancel"
第三个Push Button 的objectName 属性设为"moreButton",text 属性设为""&More",checkable 属性设为"true"(重要!)
一个vertical spacer 放在第二和第三个Push Button 之间
第一个label 的objectName 属性设为"primaryColumnLabel",text 属性设为"Column:"
第二个label 的objectName 属性设为"primaryOrderLabel",text 属性设为"Order:"
第一个Combobox 的objectName 属性设为"primaryColumnCombo"
第二个Combobox 的objectName 属性设为"primaryOrderCombo"
一个group box,objectName 属性设为"primaryGroupBox",text 属性设为"&Primary Key",
把前面两个label 和两个Combobox 放进来(对齐出问题解决:或先放group box,在一个个拖控件进去)
选中group box ->Lay Out in a Grid
右击第一个Combobox ->Edit Items ->添加"None"
右击第二个Combobox ->Edit Items ->添加"Ascending"" 和"Descending"
选中primaryGroupBox,拖出两个Copy 版GroupBox,放下面。
title 属性分别改成"&Secondary Key" 和"&Tertiary Key"
在第一个Group box 和第二个Group box 之间加一个Vertical spacer
选中窗体 ->Lay Out in a Grid
两个vertical spacer 的sizeHint 属性设为[20, 0]
窗体的objectName 属性设为"SortDialog",title 设为"Sort"
编缉Edit Tab Order 顺序,随意就好。
现在,通过Qt Creator 设置signal–slot 连接
Edit ->Edit Signals/Slots
选中要发送信号的Widget,拖动红色的箭头到欲接收信号的Widget,忪开鼠标;
连接okButton 的clicked() 和窗体的 accept()
连接cancelButton 的clicked() 和窗体的 reject()
连接moreButton 的toggled(bool) 和secondaryGroupBox的 setVisible(bool) (重要!);默认setVisible(bool) 是不显示出来的,点Show all signals and slots
连接moreButton 的toggled(bool) 和tertiaryGroupBox的 setVisible(bool) (重要!)
Edit ->Edit Widgets 离开connect 模式
//
// sortdialog.h
#ifndef SORTDIALOG_H
#define SORTDIALOG_H
#include <QDialog>
#include "ui_sortdialog.h"
class SortDialog : public QDialog, public Ui::SortDialog
{
Q_OBJECT
public:
SortDialog(QWidget *parent = 0);
void setColumnRange(QChar first, QChar last);
};
#endif
//
//
// sortdialog.cpp
#include <QtGui>
#include "sortdialog.h"
SortDialog::SortDialog(QWidget *parent)
: QDialog(parent)
{
setupUi(this);
secondaryGroupBox->hide(); // 一开始就把两GroupBox 隐藏
tertiaryGroupBox->hide();
layout()->setSizeConstraint(QLayout::SetFixedSize); // 亮点 // 设置合适的大小,size 固定不能改
setColumnRange('A', 'Z');
}
void SortDialog::setColumnRange(QChar first, QChar last)
{
primaryColumnCombo->clear();
secondaryColumnCombo->clear();
tertiaryColumnCombo->clear();
secondaryColumnCombo->addItem(tr("None"));
tertiaryColumnCombo->addItem(tr("None"));
primaryColumnCombo->setMinimumSize(
secondaryColumnCombo->sizeHint()); // 亮点 短ComboBox 向长ComboBox 看齐
QChar ch = first;
while (ch <= last) {
primaryColumnCombo->addItem(QString(ch));
secondaryColumnCombo->addItem(QString(ch));
tertiaryColumnCombo->addItem(QString(ch));
ch = ch.unicode() + 1;
}
}
//
//
// main.cpp
#include <QApplication>
#include "sortdialog.h"
#pragma comment(lib, "QtCore4.lib")
#pragma comment(lib, "QtGui4.lib")
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
SortDialog *dialog = new SortDialog;
dialog->setColumnRange('C', 'F');
dialog->show();
return app.exec();
}
//