如何从另一个窗口访问一个窗口的小部件?

Posted

技术标签:

【中文标题】如何从另一个窗口访问一个窗口的小部件?【英文标题】:How can I access a Widget of a window from another window? 【发布时间】:2015-04-13 13:23:17 【问题描述】:

我有两个带有相关 .cpp 文件的“表单”:mainwindow.cpp 和 settings.cpp

我在“MainWindow”中有一个标签“TitleLabel”,当我按下“设置”中的按钮时,我想修改它。

文件的结构是这样的(为了简化,我删除了大部分不相关的代码):

//MainWindow
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "settings.h"


//...

void MainWindow::on_Settings_clicked() //Opens settings

    Settings settings;
    settings.setModal(true);
    settings.exec();

和设置:

//Settings
#include "settings.h"
#include "ui_settings.h"
#include "mainwindow.h"

//...

void Settings::on_ChangeMain_clicked()

//what to do here?

首先我尝试这样做:

void Settings::on_ChangeMain_clicked()

MainWindow.ui->TitleLabel->setText("OK");

但它给了我一个我无法解决的语法错误,大致翻译为:

\settings.cpp:75: error: C2143: syntax error: ';' missing before '.'

我尝试添加一个';'之前 '。'但它仍然给我同样的错误。

然后我尝试创建一个指向 MainWindow 的指针并使用它,如下所示:

    void Settings::on_ChangeMain_clicked()
    
   MainWindow *mw = new MainWindow();
   mw->ui->TitleLabel->setText("OK");
    

这一次它告诉我不可能访问 MainWindow 类的私有成员。我不知道我是否应该甚至如何授予设置访问这些成员的权限。我真的很失落,我该怎么办?

编辑: 我能够通过使用 Qt 的 SIGNAL 和 SLOT 来解决这个问题。

【问题讨论】:

重复:***.com/questions/7585050/… 和许多其他相关问题 @SaZ 谢谢,所以我想我应该学习使用信号和插槽。 第一:学习一些OOP基础知识。 @SaZ 我以为我已经足够理解它们了,但显然我需要重新审视它们。 我认为在 2 个类之间共享 1 个变量 - 是编程基础。我在***上发现了很多类似的问题和答案。你应该从搜索和研究开始,而不是问这些常见的事情。见这篇文章:***.com/help/how-to-ask 【参考方案1】:

你可以这样做:

在 MainWindow 中定义公共插槽:

void MainWindow::slotChangeLabel(const QString str)

    label->setText(str);

在设置中定义信号和槽:

class Settings : public QWidget, private Ui::Settings

    Q_OBJECT

public:
    explicit Settings(QWidget *parent = 0);

signals:
    void changeLabel(const QString);


public slots:
    void clickBtn();
;

Slot 应该处理这样的事情:

    void Settings::clickBtn()

    emit changeLabel("Ok");

别忘了在“设置”小部件上为按钮连接信号和插槽:

Settings::Settings(QWidget *parent) :
    QWidget(parent)

    ...
    connect(pushButton, SIGNAL(clicked()), this, SLOT(clickBtn()));

毕竟在main() 处连接此设置和 MainWindow 小部件的信号和插槽:

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    MainWindow w;    
    Settings s;

    QObject::connect(&s, SIGNAL(changeLabel(const QString)), &w, SLOT(slotChangeLabel(const QString)));

    s.show();
    w.show();

    return a.exec();

【讨论】:

谢谢,这就是我为解决问题所做的工作。

以上是关于如何从另一个窗口访问一个窗口的小部件?的主要内容,如果未能解决你的问题,请参考以下文章

kivy - 绑定弹出窗口关闭以从另一个小部件实例中运行

从另一个 Activity 访问一个 Activity 中的小部件

如何在从另一个小部件继承的小部件中设置数据?

如何为主窗口创建的小部件创建 QCloseEvent

如何从python中的小部件在任何窗口上绘制

QT:如何关闭同一个小部件的多个窗口?