Ash*_*hot 4 c++ layout qt qgridlayout
我需要在widget 的布局中添加一个widget(QTableWidget)QFileDialog.我知道它QGridLayout有尺寸(3,4).该表必须位于第3行并跨越所有列.
QTableWidget* tableWidget = new QTableWidget(this);
QGridLayout *layout = static_cast<QGridLayout*>(QFileDialog::layout());
layout->addWidget(tableWidget, 2, 0, 1, 4);
Run Code Online (Sandbox Code Playgroud)
使用此代码,包含lineEdit和save/open pushButton的原始第3行将消失.如何在现有的小部件之间添加小部件,QGridLayout以便原始小部件保留在布局中.
我强烈建议您不要依赖QFileDialog的实现.不同平台或不同版本的Qt的布局可能不同.将表放在对话框下或其右侧可能更为正确.这可以轻松完成,而无需改变QFileDialog本身的布局.只需创建一个QVBoxLayout并将QFileDialog和QTableWidget放入其中.
但是,问题已经提出,并且存在解决方案.QGridLayout没有诸如此类的功能QBoxLayout::insertItem.所以我们需要手动实现这种行为.计划是:
工作代码:
QFileDialog* f = new QFileDialog();
f->setOption(QFileDialog::DontUseNativeDialog, true); //we need qt layout
QGridLayout *layout = static_cast<QGridLayout*>(f->layout());
QList< QPair<QLayoutItem*, QList<int> > > moved_items;
f->show();
for(int i = 0; i < layout->count(); i++) {
int row, column, rowSpan, columnSpan;
layout->getItemPosition(i, &row, &column, &rowSpan, &columnSpan);
if (row >= 2) {
QList<int> list;
list << (row + 1) << column << rowSpan << columnSpan;
moved_items << qMakePair(layout->takeAt(i), list);
i--; // takeAt has shifted the rest items
}
}
for(int i = 0; i < moved_items.count(); i++) {
layout->addItem(moved_items[i].first,
moved_items[i].second[0],
moved_items[i].second[1],
moved_items[i].second[2],
moved_items[i].second[3]);
}
QTableWidget* tableWidget = new QTableWidget();
layout->addWidget(tableWidget, 2, 0, 1, 4);
Run Code Online (Sandbox Code Playgroud)