Динамически добавлять экземпляр, унаследованный от QWidget
Я уже искал похожие вопросы, но не смог найти ничего, связанного с этой конкретной проблемой. Если у кого-то есть идея, она будет очень признательна.:)
Я работаю над инструментом для аннотации изображений (аннотация состоит из ориентиров, которые нужно расположить / перетащить на изображение). Изображение отображается в подокне (главное окно имеет контейнер 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), объекты отображаются правильно. Иначе их нет.
Есть идеи / предложения?