Добавьте виджеты в QFileDialog

Мне нужно добавить виджет (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);

С этим кодом исходная 3-я строка, которая содержит lineEdit и кнопку сохранения/открытия, исчезает. Как мне добавить виджеты между уже существующими виджетами QGridLayout, чтобы исходные виджеты остались в макете.


person Ashot    schedule 07.06.2013    source источник


Ответы (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);
person Pavel Strakhov    schedule 07.06.2013
comment
Вы должны убедиться, что в QFileDialog установлен DontUseNativeDialog, иначе вы можете получить макет NULL. - person Gerald Combs; 15.05.2015