我已经搜索过类似的问题,但找不到与此特定问题相关的任何内容。如果有人有任何想法,将不胜感激。:)
我正在研究图像注释工具(注释由要在图像上定位/拖动的地标组成)。图像显示在子窗口中(主窗口有一个 MDI 容器)。在继承子窗口的小部件类中,我尝试创建 FeatureWidget 类的几个实例(代码如下),这些实例继承自 QWidget,稍后将进一步编码以处理拖动和其他一些事情。这些特征被存储在一个标准向量(std::vector)中,我不是故意使用指针(我已经实现了复制构造函数和赋值运算符,并打算使用 vector.resize 来处理特征数量的变化)。
问题如下:如果我在子窗口小部件构造函数中创建功能,它们会按预期显示;但是,如果我稍后创建这些功能(当调用打开的注释文件菜单槽时),这些功能根本不会显示。没有错误发生,其余代码确实可以正常工作(这意味着我什至可以迭代向量和记录特征坐标)。
只是要指出:我已经在向量中使用指针实例进行了测试(即:std::vector),这似乎不是问题。功能部件设置为相同的父级(显示图像的 QLabel)。
以下是一些代码片段:
FeatureWidget 类:
class FeatureWidget: public QWidget { Q_OBJECT public: explicit FeatureWidget(QWidget *pParent = 0); FeatureWidget(const FeatureWidget &oOther); ~FeatureWidget(); FeatureWidget& operator=(const FeatureWidget &oOther); . . .
MDI 子窗口中使用的小部件类:
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); } }
来自子窗口小部件的 Slot 方法,它打开注释文件并重新定义向量中的特征小部件:
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); } }
我在测试中使用的注释文件包含 76 个功能。正如我之前所说,如果我在构造函数中强制创建这 76 个特征(调用 updateFeatureWidgets 并将大小作为参数传递,而不是从 m_oTrainingSet.numFeatures 获取),这些特征就会正确显示。否则,他们不是。
有什么想法/建议吗?