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

Есть идеи / предложения?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]