Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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/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
C++ 如何基于同一布局中的另一个小部件将添加的小部件定位到布局中?_C++_Qt_Qcombobox - Fatal编程技术网

C++ 如何基于同一布局中的另一个小部件将添加的小部件定位到布局中?

C++ 如何基于同一布局中的另一个小部件将添加的小部件定位到布局中?,c++,qt,qcombobox,C++,Qt,Qcombobox,在我的GUI中,我想根据特定操作触发的a信号,以编程方式将QComboBox添加到verticalLayout。以下代码工作正常,并添加了小部件: QComboBox* userOptions = new QComboBox(); ui->verticalLayout_13->addWidget(userOptions); 但是,通过这种方式,小部件总是添加到布局的末尾 我的问题是:如何将添加的QComboBox定位到垂直布局中,以便与同一布局中的另一个小部件对齐?(例如:在“Go

在我的GUI中,我想根据特定操作触发的a信号,以编程方式将
QComboBox
添加到
verticalLayout
。以下代码工作正常,并添加了小部件:

QComboBox* userOptions = new QComboBox();
ui->verticalLayout_13->addWidget(userOptions);
但是,通过这种方式,小部件总是添加到布局的末尾


我的问题是:如何将添加的
QComboBox
定位到
垂直布局
中,以便与同一布局中的另一个小部件对齐?(例如:在“Go”按钮上方)

似乎没有一种方法可以明确地将项目插入到您想要的布局中

您有几个选择可以通过“艰难”的方式实现这一目标:

  • 使用
    QLayout::takeAt(int-index)
    获取您要插入的索引之后的所有项目,插入您的项目,然后重新插入所获取的项目
  • 创建一个占位符小部件,您可以使用它在布局中保留索引,然后不在布局中插入该项,而是在嵌套在占位符小部件内的布局中插入该项。如果没有项目,占位符小部件将不占用空间,并扩展以容纳放入其中的任何内容
  • 实现您自己的
    QLayout
    子类,该子类支持在特定索引处插入。您必须实现几个功能

编辑:我这方面的一个遗漏,正如Kuba Ober所指出的,大多数具体的布局实现都支持在特定的索引处插入,例如,
QBoxLayout
派生的insert方法将索引作为参数传递。

首先,迭代布局以找到插入的参考项的索引。然后使用具体布局的特定小部件插入/添加功能

由于您可能使用
QBoxLayout
,因此您应该使用其
insertWidget
方法来插入小部件

// https://github.com/KubaO/stackoverflown/tree/master/questions/insert-widget-36746949
#include <QtWidgets>

namespace SO { enum InsertPosition { InsertBefore, InsertAfter }; }

bool insertWidget(QBoxLayout * layout, QWidget * reference, QWidget * widget,
                  SO::InsertPosition pos = SO::InsertBefore, int stretch = 0,
                  Qt::Alignment alignment = 0) {
   int index = -1;
   for (int i = 0; i < layout->count(); ++i)
      if (layout->itemAt(i)->widget() == reference) {
         index = i;
         break;
      }
   if (index < 0) return false;
   if (pos == SO::InsertAfter) index++;
   layout->insertWidget(index, widget, stretch, alignment);
   return true;
}

您真的需要创建一个新的QComboBox吗?因为你可以让它出现在布局中,并设置它是否可见,无论你是否需要它。@YMoreau:我只是按照你的建议使用了可见性属性。ThanksIt看起来像是很多不必要的“艰苦”工作,因为我认为这将是一个很好的、容易学习的技能。就我的应用程序而言,我将坚持您答案中的第一行(至少现在是这样),并按照“Y Moreau”的建议使用visibility属性。谢谢你可能想再看一次具体布局的文档。是的,仅仅使用
QLayout
界面是无法实现的,但是所有具体的布局都明确支持它
QGridLayout
不允许您直接插入,但您可以轻松地洗牌现有项目,以便为新项目腾出空间。@KubaOber-是的,这是真的,我以前没有注意到,主要是因为我在静态场景中没有太多使用布局,而且大部分时间都没有使用布局。我主要使用的是QML,而QML布局根本没有这个功能。在QML中,如果不使用布局,IIRC也可以动态地重新绑定位置以更改视觉布局。
int main(int argc, char ** argv) {
   QApplication app{argc, argv};
   QWidget w;
   QVBoxLayout l{&w};
   QLabel first{"First"};
   QLabel second{"Second"};
   l.addWidget(&first);
   l.addWidget(&second);
   insertWidget(&l, &first, new QLabel{"Before First"}, SO::InsertBefore);
   insertWidget(&l, &second, new QLabel{"After Second"}, SO::InsertAfter);
   w.show();
   return app.exec();
}