今天仿照《C++ GUI Qt4》编程书做个改变形状的对话框,具体步骤如下:
1.  单击文件新建选择Dialog without Button—点击“创建
2.Buttons栏中,将三个QPushButton拖到窗体,然后从Spacers栏,将一个水平分隔符拖到窗体中。用属性编辑器设置三个QPushButton第一个Button设置为OK objectName(对象名称)设置为okButton,text(文本)属性设置为OK,default属性设置为true;第二个Button设置为Cancel,objectName(对象名称)设置为cancel,text(文本)属性设置为Cancel;第三个Button设置为More,objectName(对象名称)设置为moreButton,text(文本)属性设置为&Morecheckable属性设置为”true”。注意,垂直分隔符(Vertical Spacers)处在Cancel ButtonMore Button中间。然后按住鼠标左键,拖动选中OK按钮、Cancel按钮、垂直分隔符和More按钮(或点击OK按钮,按下Shift键后在点击Cancel按钮、垂直分隔符和More按钮),然后点击窗体(Form)—垂直布局(Lay Out Vertically)
1.  创建containers(容器)拖出一个群组框、Display Widget(显示窗口部件)拖出两个标签、Input Widget(输入窗口部件)拖出两个组合框及Spacers(分隔符)拖出一个水平分隔符,把它们放到窗体上的任意位置。可以适当的调整窗口部件的大小如:群组框(GroupBox)、和组合框(ComboBox)的大小及标签(Label)的显示区域等。然后通过属性编辑器设置各个窗口部件的属性,群组框的标题(title)设置为&Primary Key,第一个标签objectName设置为primaryColumnLabel,text属性设置为”Column:”,第二个标签的objectName设置为primaryOrderLabel,text属性设置为”Order:”接着设置第一个组合框objectName设置为primaryColumnCombo,然后右键单击第一个组合框,从Qt设计师弹出上下文菜单的框编辑器中选择编辑项目(Edit Items.点击”+”添加一个文本”None”项目,在点击确定。注意,第一个组合框后面有个水平分隔符,目的是调整各部件的空间位置。设置第二个组合框objectName设置为primaryOrderCombo,右键单击第二个组合框,弹出对话框菜单中选择编辑项目(Edit Items,点击“+“在项目列表中创建两个项目,一个项为“Ascending”,另一项为“Descending”,点击确定。点击群组框,然后单击窗体(Form选择栅格布局(Lay Out a Grid)或选中群组框,直接按Ctrl+5。再次点击群组框,并且单击窗体(Form---选择调整大小(Adjust Size)或点击群组框直接按Ctrl+j。如果设置不合理想重新设置,点击编辑,撤销设置(或按Ctrl+Z,或选中窗体(From)—选择打破布局(或按Ctrl+O.直到设置到满意为止。
接着添加其他两个群组框:Secondary Key Tertiary Key:
1.为了节省时间,选择复制粘贴,然后做适当的修改,调整对话框窗口做够高,能在容纳另外两个群组框。
2.按下Ctrl键,然单击并拖动Primary Key群组框,这样就可以在原来群组框(以及它所含的所有组件)的上方复制出一个新的群组框,将复制的群组框放到primary Key群组框下方,以同样的方法复制第三个群组框。然后修改第二、三个群组框及群组框内部的各部件属性。
设置第二个群组框标题(title)&Secondary Key,objectName对象名称为secondaryGroupBox,两个标签设置它们的ObjectName(对象名称)分别为secondaryColumnLabelsecondaryOrderLabel。两个组合框objectName(对象名称)分别为secondaryColumnCombosecondaryOrderCombo。同样,设置第三群组框及各部件的属性,群组框标题为&Tertiary Key,两个标签的对象名称属性为tertiaryColumnLabel,tertiaryOrderLabel,两个组合框的对象名称属性为tertiaryColumnCombotertiaryOrderCombo.
3.&Primary Key&Secondary Key中间还有一个部件,垂直分隔符。创建一个水平分隔符。
4.排列一下窗口部件,排列成网格状
6.单击窗体,取消对任意选中窗口部件的选择,然后单击窗体(Form)—栅格布局(Lay Out in a Grid.点击窗体(Form)—调整大小(Adject Size)设置两个垂直分隔符的sizeHint属性,设置为[20,0]宽度为20,长度为0。如果觉得设置的还不够合适,可以用鼠标向上和向左拖动窗体的右下角,以便让窗体变的尽可能的小。
7.点击对话框窗体空白处,选择对话框窗体将其objectName设置为SortDialog,windowTitle设置为Sort
单击编辑(Edit)—编辑Tab顺序(Edit Tab Order),从窗体的最上面到最下面依次单击每个组合框,然后单击窗体右侧的OKCancelMore按钮。单击编辑(Edit)—编辑窗口部件(Edit Widgets)离开Tab键顺序设置模式。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

建立信号和槽的链接,点击编辑(Edit)--编辑信号和槽(Edit Signals/Slots),进入Qt设计师的设置链接模式。窗体中各个窗口部件之间的连接用蓝色箭头表示,并且它们也同时在Qt设计师的信号和槽编辑器窗口中显示出来。要在两个窗口部件之间建立连接,可以单击作为发射器的窗口部件并且拖动所产生的红色箭头线到作为接收器的窗口部件上,然后松开鼠标按键。这时会弹出下面的对话框,可以从中选择建立连接信号和槽。要建立的第一个连接位于okButton按钮和窗体的accept()槽之间。把从okButton按钮开始的红色箭头线拖动到窗体的空白区域,然后松开按键,这样会弹出如下图所示配置连接对话框(Configure Connection dilaog.从该对话框中选择clicked()作为信号,选择accept()作为槽,然后单击OK按钮。
对于第二个连接,把从cancelButton按钮开始的红色箭头线拖动到窗体的空白区域,然后在设置链接对话框中连接按钮的cliecked()信号和窗体的reject()
要建立的第三连接位于moreButton按钮和secondaryGroupBox群组框之间。在这两个窗口部件之间拖动红色箭头线,然后选择toggledbool)作为信号,选择setVisiblebool)作为槽。默认情况下,setVisible(bool)槽不会显示在Qt设计师的槽列表中,但如果选中了”Show all signal and slots”选项,就可以看到这个槽了。
第四个也是最后一个要建立的链接是moreButton按钮的toggled(bool)信号和tertiaryGroupBox群组框setVisiblebool)槽之间的链接。这些连接一旦完成,就可以单击编辑(Edit)—编辑窗口部件(Edit Widgets)而离开创建连接模式。
sortdialog.h头文件
class SortDialog : public QDialog, public Ui::SortDialog
{
    Q_OBJECT

 

public:
    SortDialog(QWidget *parent = 0);

 

    void setColumnRange(QChar first, QChar last);
};
 
sortdialog.cpp源文件
SortDialog::SortDialog(QWidget *parent)
    : QDialog(parent)
{
    setupUi(this);

 

    secondaryGroupBox->hide();
    tertiaryGroupBox->hide();
    layout()->setSizeConstraint(QLayout::SetFixedSize);

 

    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());

 

    QChar ch = first;
    while (ch <= last) {
        primaryColumnCombo->addItem(QString(ch));
        secondaryColumnCombo->addItem(QString(ch));
        tertiaryColumnCombo->addItem(QString(ch));
        ch = ch.unicode() + 1;
    }
}
 
main.cpp主函数源文件
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    SortDialog *dialog = new SortDialog;
    dialog->setColumnRange('C', 'F');
    dialog->show();
    return app.exec();
}
 
最终程序运行效果如下:
 
 
 
呵呵。。。简单的改变形状的对话框就做好了。。。