Qt 布局管理器使用心得——使用多个layout注意事项

qt 布局管理器有QHBoxLayout, QVBoxLayout, QGridLayout, QFormLayout四种,前两种是在widget水平或者垂直布局, girdle是widget以格子的形式布局,from是在widget上以row的形式布局。

如果用多个Layout共同布局时,只能对最终要显示的layout进行设置父窗口的指针.

 treeWidget = new QTreeWidget(this);
    treeWidget->setColumnCount(1);
    QList<QTreeWidgetItem*> item;
    for(int i = 0; i < 3; i++)
    {
        item.append(new QTreeWidgetItem(treeWidget, QStringList(QString("itme :%1").arg(i))));
    }
    item.clear();
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
            item.append(new QTreeWidgetItem(treeWidget->topLevelItem(i), QStringList(QString("item :%1%2").arg(i).arg(j))));
    }

    tableWidget = new QTableWidget(this);
    tableWidget->setColumnCount(5);
    tableWidget->setRowCount(5);

    QStringList tabeleHeader;
    tabeleHeader << "line Number" << "ID" << "Name" << "Age" << "Sex";
    tableWidget->setHorizontalHeaderLabels(tabeleHeader);
    tableWidget->setItem(0, 0, new QTableWidgetItem(QString("1")));
    tableWidget->setItem(1, 0, new QTableWidgetItem(QString("2")));
    tableWidget->setItem(2, 0, new QTableWidgetItem(QString("3")));
    tableWidget->setItem(3, 0, new QTableWidgetItem(QString("4")));
    tableWidget->setItem(4, 0, new QTableWidgetItem(QString("5")));
    tableWidget->setItem(0, 1, new QTableWidgetItem(tr("20100202")));

    QHBoxLayout *layou = new QHBoxLayout;
    layou->addWidget(treeWidget);
    layou->addWidget(tableWidget);



    strModel = new QStringListModel(this);
    QStringList strList;
    strList << "LetterA" << "LetterB" << "LetterC";
    strModel->setStringList(strList);
    listView = new QListView(this);
    listView->setModel(strModel);

    QHBoxLayout *btnLayout = new QHBoxLayout;
    QPushButton *btnInsert = new QPushButton(tr("Insert"), this);
    QPushButton *btnDetele = new QPushButton(tr("Detele"), this);
    QPushButton *btnShow = new QPushButton(tr("Show"), this);
    btnLayout->addWidget(btnInsert);
    btnLayout->addWidget(btnDetele);
    btnLayout->addWidget(btnShow);

    QVBoxLayout *mianLayout = new QVBoxLayout(this);
    mianLayout->addLayout(layou);
    mianLayout->addWidget(listView);
    mianLayout->addLayout(btnLayout);
    setLayout(mianLayout);

只设置最后显示的QVBoxLayout 的父窗口指针。QVBoxLayout*mianLayout=newQVBoxLayout(this);

其运行结果如下

如果你设置多个layout的父窗口指针时你的界面将优先布局最早设置父窗口的layout。

如下代码

 QHBoxLayout *btnLayout = new QHBoxLayout(this);
    QPushButton *btnInsert = new QPushButton(tr("Insert"), this);
    QPushButton *btnDetele = new QPushButton(tr("Detele"), this);
    QPushButton *btnShow = new QPushButton(tr("Show"), this);
    btnLayout->addWidget(btnInsert);
    btnLayout->addWidget(btnDetele);
    btnLayout->addWidget(btnShow);

    QVBoxLayout *mianLayout = new QVBoxLayout(this);
    mianLayout->addLayout(layou);
    mianLayout->addWidget(listView);
    mianLayout->addLayout(btnLayout);
    setLayout(mianLayout);

有两处layout设置窗口。 QHBoxLayout*btnLayout=newQHBoxLayout(this); QVBoxLayout*mianLayout=newQVBoxLayout(this);

其运行结果如下

这块只显示了 QHBoxLayout*btnLayout=newQHBoxLayout(this);这个layout的布局其他layout的布局基本直接忽略了。

 另注:Qt布局管理器只能在widget有效。在其他地方可能失效(只试过在MainWidows中使用失效)。

 

posted @ 2014-04-08 17:06  菜鸟路上ing  阅读(3132)  评论(0)    收藏  举报