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