【问题标题】:Qt: How to put collection of GUI-Elements into independent SubClass (with seperate *.ui file)Qt:如何将 GUI 元素的集合放入独立的子类(带有单独的 *.ui 文件)
【发布时间】:2011-09-18 01:18:34
【问题描述】:

我正在尝试将一个常用的 GUI 元素子集收集到一个子类中,以后可以将其“包含”到真正的 GUI 中,而无需重写给定的功能(不要问为什么,我想学习它)以后使用)。子类应该使用它自己的 *.ui-File 并且应该被放入一个 QWidget 中,它位于真实的 GUI 中。在此之后,最好从真实的 GUI 访问子类的一些方法——比如按钮的状态。

但是我该如何正确地做到这一点呢?

目前,我的子类工作并在 main 中实例化,但无法从真正的 GUI 访问,因为它仅在 main 中声明。

我的子类头文件:

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

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

对应的构造函数。我必须使用“parent”而不是“this”来运行 setupUI,但我不确定这是否正确——无论如何,它可以工作......否则,子类中的子元素不会显示在主窗口中真正的 GUI。

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

在 main.cpp 中构造了主窗口,它也使用它自己的 *.ui 文件(包含一个小部件“widget_loggerArea”)。这样做,我无法从“loggerTest”中访问“logger”的方法:

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++ 业力...

【问题讨论】:

    标签: c++ user-interface qt qt4


    【解决方案1】:

    所以,答案就在真正的 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);
    }
    

    是的,就是这样...只是为了完整性,也许有人需要类似的“朝着正确的方向前进”...

    编辑:在子类的标题中,ui-Elements 的范围也必须更新为“公共”:

    class logger : public QWidget, public Ui::loggerWidget {
        Q_OBJECT
    
        public:
            logger(QWidget *parent = 0);
            virtual ~logger();
    }
    

    【讨论】:

    • 只缺少一个。您曾说过您希望能够访问记录器 UI 中对象的状态。如果您仍然需要它,那么在记录器的标题中,然后将 ui 变量的范围从私有更改为公共。
    • 啊,谢谢,你是对的——在本地做的,忘了提,更正了我的答案......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2021-02-15
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多