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中使用失效)。

浙公网安备 33010602011771号