4

我需要在的布局中添加一个小部件 ( 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);

使用此代码,包含 lineEdit 和保存/打开按钮的原始第 3 行将消失。如何在现有的小部件之间添加小部件,QGridLayout以便原始小部件保留在布局中。

4

1 回答 1

8

我强烈建议你不要依赖 QFileDialog 的实现。布局在不同平台或不同版本的 Qt 上可能不同。将表格放在对话框下方或右侧可能更正确。这可以很容易地完成,而无需更改 QFileDialog 本身的布局。只需创建一个 QVBoxLayout 并将 QFileDialog 和 QTableWidget 放入其中。

但是,问题已经提出,并且存在解决方案。QGridLayout 没有诸如QBoxLayout::insertItem. 所以我们需要手动实现这个行为。计划是:

  1. 获取放置在第 3 行和第 4 行的布局项目列表。
  2. 计算项目的新位置。
  3. 从项目中取出元素并将它们添加回新位置。

工作代码:

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);
于 2013-06-07T19:33:10.913 回答