Инициализировать не копируемый сторонний базовый класс с указателем на объект

0

Я сражаюсь с Qt. Не удается найти надежное решение для моей конкретной проблемы.

У нас есть пользовательский class MyWidget который должен:

  • быть выведено из QWidget для переопределения метода closeEvent
  • имеют поля, которые должны быть инициализированы в конструкторе

Проблемы:

  • QWidget QUiLoader инициализируется с помощью QUiLoader из файла .ui. Поэтому у меня есть только указатель QWidget*
  • QWidget не копируется.
  • QWidget не имеет конструктора перемещения

Код (проверка ошибок и управление памятью для простоты опущены):

class MyWidget : public QWidget
{
    bool m_Closed;
public:
    MyWidget(QWidget* qw) : 
        QWidget(*qw), // error: copy constructor is private
        m_Closed(false)
    {}

    bool IsClosed() const { return m_Closed; }

    virtual void closeEvent(QCloseEvent *) override { m_Closed = true; }
};

QFile file("main.ui");
QUiLoader uiLoader;
MyWidget* uiMain = new MyWidget(uiLoader.load(&file));
uiMain->show();

Вопросов:

  • Как я могу обойти это? Я считаю, что решение очень простое.
  • Могу ли я использовать семантику перемещения здесь?

Обратите внимание, что:

  • Я не могу сделать член QWidget, поскольку мне нужно переопределить его метод.
  • Вероятно, я могу сделать некоторый MyWidget::Init(), чтобы инициализировать этот флаг bool, который должен вызываться после каждого экземпляра. Но я считаю это решение ненадежным.
  • В конце концов, у меня должен быть только QWidget, я могу проверить, закрыт он или нет (возможно, вы знаете другой, простой способ)
  • Я использую MSVC 2013 RC и GCC 4.8.1, поэтому решение С++ 11 было бы замечательно

Не стесняйтесь, я ценю любые предложения и критику.

Теги:
qt
inheritance

1 ответ

1

.ui файлы могут использовать пользовательские классы, которые происходят из QWidget, поэтому вы можете использовать свой класс в Designer - даже без написания плагинов Designer (он не будет показан). Щелкните правой кнопкой мыши виджет и выберите "Продвигать".

Вам необходимо создать собственную производную версию QUiLoader и обеспечить реализацию заводского метода QUiLoader::createWidget который может создавать ваши виджеты. См. Этот ответ для полного примера.

Затем вы вводите код инициализации в производном виджете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню