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

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

0 ответов

Другие вопросы по тегам