【问题标题】:Add widgets to QFileDialog将小部件添加到 QFileDialog
【发布时间】:2013-06-03 23:39:39
【问题描述】:

我需要在QFileDialog 的布局中添加一个小部件 (QTableWidget)。我知道它是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 的现有小部件之间添加小部件,以便原始小部件保留在布局中。

【问题讨论】:

    标签: c++ qt layout qgridlayout


    【解决方案1】:

    我强烈建议您不要依赖 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);
    

    【讨论】:

    • 你需要确保 QFileDialog 设置了 DontUseNativeDialog,否则你可能会得到一个 NULL 布局。
    猜你喜欢
    • 2016-10-05
    • 2017-07-11
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2014-08-16
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多