代码之家  ›  专栏  ›  技术社区  ›  marvin2k

Qt:如何将GUI元素的集合放入独立的子类(使用单独的*.ui文件)

  •  0
  • marvin2k  · 技术社区  · 15 年前

    我正在尝试将一个常用的GUI元素子集收集到一个子类中,以后可以“包含”到真正的GUI中,而无需重写给定的功能(不要问为什么,我想学习它以备将来使用)。子类应该使用它自己的*.ui文件,并且应该在真正的GUI中放入QWidget resding。在这之后,从真正的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
    }
    

    内部主.cpp主窗口被构造,它也使用它自己的*.ui文件(包含一个小部件“widget\u 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++因果报应…

    1 回复  |  直到 14 年前
        1
  •  1
  •   marvin2k    15 年前

    所以,答案是在真正的GUI类中。施工单位:

    testLogger::testLogger(QMainWindow *parent) : QMainWindow(parent){
        setupUi(this);
    
        myLog = new logger(widget_loggerArea);
    }
    

    在主.cpp:

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

    在记录器的构造函数中,setupUi使用“this”:

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

    是的,就是这样。。。只是为了完整性,也许有人需要类似的“往正确的方向推”。。。

    编辑:在子类的标题中,ui元素的范围也必须更新为“public”:

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