我已经搜索过类似的问题,但找不到与此特定问题相关的任何内容。如果有人有任何想法,我将非常感激。 :)
我正在开发一个图像注释工具(注释由要在图像上定位/拖动的地标组成)。图像显示在子窗口中(主窗口有一个MDI容器)。在继承子窗口的窗口小部件类中,我试图创建一个FeatureWidget类的实例(代码如下),继承自QWidget,稍后将进一步编码以处理拖动和其他一些事情。这些特性存储在std向量(std :: vector)中,我没有故意使用指针(我已经实现了复制构造函数和赋值运算符,并打算使用vector.resize来处理特征数量的变化) )。
问题如下:如果我在子窗口小部件构造函数中创建功能,它们将按预期显示;但是,如果我稍后创建这些功能(当调用打开的注释文件菜单槽时),则根本不会显示这些功能。没有错误ocurr和其余的代码确实正常(意味着我甚至可以迭代向量和日志功能坐标)。
只是要指出:我已经在向量中测试了指针实例(即: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);
}
}
子窗口小部件中的插槽方法,用于打开注释文件并重新定义向量中的要素小部件:
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获取),则会正确显示这些特征。否则,他们不是。
有任何想法/建议吗?