Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将小部件添加到QFileDialog_C++_Qt_Layout_Qgridlayout - Fatal编程技术网

C++ 将小部件添加到QFileDialog

C++ 将小部件添加到QFileDialog,c++,qt,layout,qgridlayout,C++,Qt,Layout,Qgridlayout,我需要将小部件(QTableWidget)添加到QFileDialog的布局中。我知道它是QGridLayout,大小(3,4)。该表必须位于第三行并跨越所有列 QTableWidget* tableWidget = new QTableWidget(this); QGridLayout *layout = static_cast<QGridLayout*>(QFileDialog::layout()); layout->addWidget(tableWidget, 2, 0,

我需要将小部件(
QTableWidget
)添加到
QFileDialog
的布局中。我知道它是
QGridLayout
,大小
(3,4)
。该表必须位于第三行并跨越所有列

QTableWidget* tableWidget = new QTableWidget(this);
QGridLayout *layout = static_cast<QGridLayout*>(QFileDialog::layout());
layout->addWidget(tableWidget, 2, 0, 1, 4);
QTableWidget*tableWidget=新的QTableWidget(此);
QGridLayout*layout=static_cast(QFileDialog::layout());
布局->添加小部件(tableWidget,2,0,1,4);

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

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

然而,有人提出了这个问题,解决办法是存在的。QGridLayout没有功能,例如
QBoxLayout::insertItem
。因此,我们需要手动实现此行为。该计划是:

  • 获取放置在第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);
    
    QFileDialog*f=新建QFileDialog();
    f->setOption(QFileDialog::DontUseNativeDialog,true)//我们需要qt布局
    QGridLayout*layout=static_cast(f->layout());
    QList移动的项目;
    f->show();
    对于(int i=0;icount();i++){
    int row,column,rowSpan,columnSpan;
    布局->getItemPosition(i,&row,&column,&rowSpan,&columnSpan);
    如果(行>=2){
    QList列表;
    
    列出您需要确保QFileDialog已设置DontUseNativeDialog的列表,否则最终可能会出现空布局。