Qt: Как поместить коллекцию GUI-элементов в независимый подкласс (с отдельным файлом * .ui) - PullRequest
0 голосов
/ 25 сентября 2010

Я пытаюсь собрать часто используемое подмножество GUI-элементов в один подкласс, который позже можно будет «включить» в реальные GUI, не переписывая данную функциональность (не спрашивайте почему, я хочу изучить его для позже использовать). Подкласс должен использовать свой собственный * .ui-файл и должен быть помещен в QWidget, размещенный в реальном GUI. После этого было бы неплохо получить доступ к некоторым методам подкласса из реального графического интерфейса - например, состояние кнопки или около того.

Но как мне сделать это правильно?

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

Заголовочный файл моего подкласса:

class logger : public QWidget, private Ui::loggerWidget {
    Q_OBJECT

public:
    logger(QWidget *parent = 0);
    virtual ~logger();
    // some more stuff...
}

Соответствующий конструктор. Мне пришлось запустить setupUI с «parent» вместо «this», но я не уверен, что это правильно - в любом случае, это работает ... в противном случае, подэлементы из подкласса не отображаются в главном окне настоящий графический интерфейс.

logger::logger(QWidget *parent) : QWidget(parent){
    setupUi(parent);
    //ctor
}

Внутри main.cpp также создано главное окно, которое использует собственный * .ui-файл (содержащий один виджет "widget_loggerArea"). При этом я не могу получить доступ к методам "logger" из "loggerTest":

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    loggerTest window;

    logger myLog(window.widget_loggerArea);

    window.show();

    return app.exec();
}

Я не могу поместить конструктор "logger" в конструктор главного окна "loggerTest", поскольку он будет уничтожен немедленно и никогда не попадет в цикл обработки событий.

Я уверен, что мне не хватает какой-то концепции объектно-ориентированного программирования или способа, которым qt справляется со своими вещами ... Я был бы рад, если бы кто-то мог выразить мне это мнение;


Я был так глуп ... использование указателя с new и delete делает работу ... это так глупо, я не могу в это поверить! В последнее время я больше привык к VHDL, это ослабляет мой C ++ - карму ...

1 Ответ

1 голос
/ 26 сентября 2010

Итак, ответ в реальном классе GUI. Конструктор:

testLogger::testLogger(QMainWindow *parent) : QMainWindow(parent){
    setupUi(this);

    myLog = new logger(widget_loggerArea);
}

В main.cpp:

QApplication app(argc, argv);
testLogger window;
window.show();

А в конструкторе регистратора setupUi работает с «this»:

dfkiLogger::dfkiLogger(QWidget *parent) : QWidget(parent){
    setupUi(this);
}

Да, вот и все ... Просто для полноты, возможно, кому-то нужен подобный "толчок в правильном направлении" ...

РЕДАКТИРОВАТЬ: в заголовке подкласса область действия элементов пользовательского интерфейса должна быть обновлена ​​до "public":

class logger : public QWidget, public Ui::loggerWidget {
    Q_OBJECT

    public:
        logger(QWidget *parent = 0);
        virtual ~logger();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...