将小部件添加到QFileDialog

时间:2013-06-07 15:37:58

标签: c++ qt layout qgridlayout

我需要将小部件(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和save / open pushButton的原始第3行将消失。如何在已存在的QGridLayout窗口小部件之间添加窗口小部件,以便原始窗口小部件保留在布局中。

1 个答案:

答案 0 :(得分:7)

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

然而,问题已被提出,并且存在解决方案。 QGridLayout没有QBoxLayout::insertItem等功能。所以我们需要手动实现这种行为。计划是:

  1. 获取放置在第3行和第4行的布局项列表。
  2. 计算物品的新位置。
  3. 从项目中取出元素并将其添加回新位置。
  4. 工作代码:

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