操作步骤

假设我们有一个类Test需要调用主窗口中的ui控件,但是没有ui指针,如何将ui指针传过去呢?

一、其他类必须继承QWidegt及其派生类

一个类如果想要使用ui控件,必须继承QWidegt及其派生类,否则无法调用ui指针

class Test : public QWidget
{
    Q_OBJECT
public:
    explicit Test(QWidget *parent = nullptr);
signals:

public slots:
};

#endif // TEST_H

二、将主窗口UI公有化

将widget.h 中的私有的ui指针公有化

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    Ui::Widget *ui;
private:
    //Ui::Widget *ui;

三、定义一个静态的Widget指针

我们需要定义一个公有的静态Widget指针从widget中将ui传入到Test类中,否则即使Test类中载入#include "widget.h"和#include "ui_widget.h"也无法调用ui指针

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    static Widget *mywidget;	//此处定义了一个mywidget指针
    Ui::Widget *ui;
private:
    //Ui::Widget *ui;
};

然后在.cpp文件中将指针初始化

Widget* Widget::mywidget = nullptr;

将我们主窗口的this传给mywidget

mywidget = this;

四、将mywidget 指针中的ui指针传给Test中我们定义的ui指针

class Test : public QWidget
{
    Q_OBJECT
public:
    explicit Test(QWidget *parent = nullptr);
    Ui::Widget *ui = Widget::mywidget->ui;
signals:

public slots:
};

这样就可以在Test中通过ui指针调用ui控件

代码

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    static Widget *mywidget;
    Ui::Widget *ui;

private:
    //Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "test.h"

Widget* Widget::mywidget = nullptr;

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    mywidget = this;
    Test t;
    t.mybutton();
}
Widget::~Widget()
{
    delete ui;
}

test.h

#ifndef TEST_H
#define TEST_H

#include <QWidget>
#include "widget.h"
#include "ui_widget.h"

class Test : public QWidget
{
    Q_OBJECT
public:
    explicit Test(QWidget *parent = nullptr);
    Ui::Widget *ui = Widget::mywidget->ui;
    void mybutton();
};
#endif // TEST_H

test.cpp

#include "test.h"
Test::Test(QWidget *parent) : QWidget(parent)
{

}
void Test::mybutton()
{
    ui->pushButton->setText("操作成功");
}

个人建议

不建议将ui公有化,这样会使程序不安全,在写项目时会出现各种各样的错误,可以在其他类中发送信号,在窗口类中使用槽函数进行接受。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐