Qt Расширение моего собственного виджета

Проще говоря, я хочу новый класс, который расширяет созданный мной пользовательский виджет и, таким образом, имеет полный доступ к его пользовательскому интерфейсу.

До сих пор я пробовал несколько различных методов, основанных на том, как обычно можно создавать подклассы / расширять классы, но я почему-то ужасно терплю неудачу по многим различным причинам.

Кроме того, простое использование моего виджета в качестве члена в моем новом классе не подойдет для этой ситуации.

Может кто-нибудь проиллюстрировать быстрый пример того, как я это сделаю? Я сделал кучу поисков, но я не могу найти какие-либо хиты, касающиеся именно того, что я пытаюсь сделать
Если все остальное не поможет, я просто скопирую код и создаю новый виджет, который технически сэкономил бы мне много времени, но это было бы неправильно делать.

Моим первым инстинктом было сделать что-то подобное ( Qwe быть моим новым классом, Asd будучи виджетом):

class Qwe : Asd {public: ...}

И я даже сделал пользовательский интерфейс виджета общедоступным, но потом только что получил ошибку:

использование неопределенного типа Ui :: Asd

всякий раз, когда я пытался получить доступ к элементам пользовательского интерфейса.

0

Решение

Допустим, у нас есть собственный виджет с именем BaseWidget и дочерний виджет с именем ChildWidget, декларировать BaseWidget как обычно, но сделай свое ui член защищен вместо частного, вот так:

protected:
Ui::BaseWidget *ui;

декларировать ChildWidget как обычный виджет, полученный из BaseWidget, Убедитесь, что вы включили ui_BaseWidget.h в ChildWidget.cpp файл, так же, как вы делаете это в BaseWidget.cpp (это включает и сам заголовок генерируется Qt).

Заголовок:

#include "BaseWidget.h"
class ChildWidget : public BaseWidget {
Q_OBJECT
public:
explicit ChildWidget(QString text, QWidget *parent = 0);
};

Источник:

#include "ChildWidget.h"#include "ui_BaseWidget.h"
ChildWidget::ChildWidget(QString text, QWidget *parent) :
BaseWidget(parent)
{
ui->label->setText(text);
}
2

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


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