C++ 动态添加从QWidget继承的实例
我已经搜索过类似的问题,但找不到与此特定问题相关的任何内容。如果有人有任何想法,我们将不胜感激。:) 我正在使用图像注释工具(注释由要定位/拖动到图像上的地标组成)。图像显示在子窗口中(主窗口具有MDI容器)。在继承子窗口的小部件类中,我试图创建FeatureWidget类的几个实例(下面的代码),这些实例是从QWidget继承的,稍后将进一步编码以处理拖动和其他一些事情。这些特性存储在一个std向量(std::vector)中,我不是故意使用指针(我已经实现了复制构造函数和赋值操作符,并打算使用vector.resize来处理特性数量的变化) 问题如下:如果我在子窗口小部件构造函数中创建特性,它们将按预期显示;但是,如果我稍后创建这些功能(当调用“打开注释文件”菜单槽时),这些功能根本不会显示。没有错误ocurr,其余代码工作正常(这意味着我甚至可以迭代向量和日志特征坐标) 只是要指出:我已经用向量中的指针实例(即:std::vector)进行了测试,这似乎不是问题所在。正在使用相同的父级(显示图像的QLabel)设置功能部件 下面是一些代码片段:C++ 动态添加从QWidget继承的实例,c++,qt,qwidget,custom-widgets,C++,Qt,Qwidget,Custom Widgets,我已经搜索过类似的问题,但找不到与此特定问题相关的任何内容。如果有人有任何想法,我们将不胜感激。:) 我正在使用图像注释工具(注释由要定位/拖动到图像上的地标组成)。图像显示在子窗口中(主窗口具有MDI容器)。在继承子窗口的小部件类中,我试图创建FeatureWidget类的几个实例(下面的代码),这些实例是从QWidget继承的,稍后将进一步编码以处理拖动和其他一些事情。这些特性存储在一个std向量(std::vector)中,我不是故意使用指针(我已经实现了复制构造函数和赋值操作符,并打算使
- 功能部件类:
class FeatureWidget: public QWidget { Q_OBJECT public: explicit FeatureWidget(QWidget *pParent = 0); FeatureWidget(const FeatureWidget &oOther); ~FeatureWidget(); FeatureWidget& operator=(const FeatureWidget &oOther); . . .
class ChildAnnotationWidget : public QWidget { Q_OBJECT private: std::vector<FeatureWidget> m_vFeatureWidgets; . . .
void ff::ChildAnnotationWidget::updateFeatureWidgets() { if(m_oTrainingSet.numFeatures() == 0) m_vFeatureWidgets.clear(); else { m_vFeatureWidgets.resize(m_oTrainingSet.numFeatures()); for(unsigned int i = 0; i < m_vFeatureWidgets.size(); i++) m_vFeatureWidgets[i].setParent(ui->lbImage); } }
void ff::ChildAnnotationWidget::openAnnotation() { QString sFile = QFileDialog::getOpenFileName(this, tr("Open Annotation File"), ".", tr("Annotation Files (*.yaml)")); if(sFile.length()) { if(m_oTrainingSet.loadFromFile(qPrintable(sFile))) { m_sFileName = sFile; m_bChanged = false; updateFeatureWidgets(); showSample(1); updateStatusBar(); } else QMessageBox::critical(NULL, tr("Error Opening Annotation"), tr("It was not possible to open the annotation file. Please verify if the file format is correct."), QMessageBox::Ok); } }
- MDI子窗口中使用的小部件类:
class FeatureWidget: public QWidget { Q_OBJECT public: explicit FeatureWidget(QWidget *pParent = 0); FeatureWidget(const FeatureWidget &oOther); ~FeatureWidget(); FeatureWidget& operator=(const FeatureWidget &oOther); . . .
class ChildAnnotationWidget : public QWidget { Q_OBJECT private: std::vector<FeatureWidget> m_vFeatureWidgets; . . .
void ff::ChildAnnotationWidget::updateFeatureWidgets() { if(m_oTrainingSet.numFeatures() == 0) m_vFeatureWidgets.clear(); else { m_vFeatureWidgets.resize(m_oTrainingSet.numFeatures()); for(unsigned int i = 0; i < m_vFeatureWidgets.size(); i++) m_vFeatureWidgets[i].setParent(ui->lbImage); } }
void ff::ChildAnnotationWidget::openAnnotation() { QString sFile = QFileDialog::getOpenFileName(this, tr("Open Annotation File"), ".", tr("Annotation Files (*.yaml)")); if(sFile.length()) { if(m_oTrainingSet.loadFromFile(qPrintable(sFile))) { m_sFileName = sFile; m_bChanged = false; updateFeatureWidgets(); showSample(1); updateStatusBar(); } else QMessageBox::critical(NULL, tr("Error Opening Annotation"), tr("It was not possible to open the annotation file. Please verify if the file format is correct."), QMessageBox::Ok); } }
有什么想法/建议吗?不要复制小部件(以及一般的QObject),也不要按价值管理它们。这很容易失败。使用std::vector。尽管如此,实际的问题可能是您没有在小部件上调用show()。非常感谢您,弗兰克。缺少一个show()调用。另外,谢谢你的建议。:)干杯