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 - Fatal编程技术网

C++ 选择“正确”的子项

C++ 选择“正确”的子项,c++,qt,C++,Qt,在对话框窗体上有几个项目,其中我有一个QListView和QTreeView。 我想在初始化此对话框期间将它们加载到QSet。最好的方法是什么?您可以循环浏览对话框的子项,尝试将它们强制转换到QabstratemView*并添加通过的子项: #include <QtGui> int main(int argc, char **argv) { QApplication app(argc, argv); QVBoxLayout *layout = new QVBoxLayou

在对话框窗体上有几个项目,其中我有一个QListView和QTreeView。
我想在初始化此对话框期间将它们加载到QSet。最好的方法是什么?

您可以循环浏览对话框的子项,尝试将它们强制转换到QabstratemView*并添加通过的子项:

#include <QtGui>

int main(int argc, char **argv) {
  QApplication app(argc, argv);

  QVBoxLayout *layout = new QVBoxLayout;
  layout->addWidget(new QLabel("Hello!"));
  layout->addWidget(new QListView);
  layout->addWidget(new QTreeView);
  layout->addWidget(new QPushButton("Click me!"));

  QDialog d;
  d.setLayout(layout);
  d.show();

  QSet<QAbstractItemView*> set;
  for (int i = 0; i < d.children().size(); ++i) {
    QAbstractItemView *view = qobject_cast<QAbstractItemView*>(d.children().at(i));
    if (view) {
      set << view;
    }
  }

  qDebug() << set.size();

  return app.exec();
}

以下可能适用于未选中的代码:

QSet<QAbstractItemView*> childViews;
for (QObjectList::iterator it = children().begin(); it != children().end(); ++it)
{
    QAbstractItemView* view = qobject_cast<QAbstractItemView*>(*it);
    if (view != 0)
    {
        childViews.insert(view);
    }
}

它们是两种不同的类型,因此您总是会遭受某种形式的类型擦除。为什么要这样做?@cbamber85我想让这个对话框变得通用,因为如果我将来添加其他视图,它将自动检测并连接到模型,而无需我做任何事情。谢谢你的回答。我想我没有清楚地表达我想要什么。好的,我有一个对话。在这个对话框中,我有很多小部件,其中一些可能是视图类型,也可能是从qabstractemview派生的对象。我想在这个对话框的初始化过程中检测我有多少个,并将指向它们的指针放入QSet;