C++ 如何从另一个类编辑QMainWindowUI小部件?

C++ 如何从另一个类编辑QMainWindowUI小部件?,c++,qt,qt5,qt-signals,qtwidgets,C++,Qt,Qt5,Qt Signals,Qtwidgets,我需要在另一个源文件中从MainWindow的UI编辑QLabel。我试着去摆弄信号和吃角子老虎机,但老实说,我完全迷路了,在这种情况下,这对我没有帮助。我知道过去有人问过这个问题,但我没有找到一个适合我的解决方案。我对Qt和C++都是新手。 我有以下代码(大大简化): “mainwindow.h”: “secondwindow.h” 当用户单击fooButton时,我需要访问并编辑主窗口的UI QLabel(或执行此操作的公共方法)。 未在main()函数中创建第二个窗口 在OOP中,交互的是

我需要在另一个源文件中从MainWindow的UI编辑QLabel。我试着去摆弄信号和吃角子老虎机,但老实说,我完全迷路了,在这种情况下,这对我没有帮助。我知道过去有人问过这个问题,但我没有找到一个适合我的解决方案。我对Qt和C++都是新手。

我有以下代码(大大简化):

“mainwindow.h”:

“secondwindow.h”

当用户单击fooButton时,我需要访问并编辑主窗口的UI QLabel(或执行此操作的公共方法)。 未在main()函数中创建第二个窗口


在OOP中,交互的是对象,而不是类或文件,也就是说,下面的表达式:我需要在另一个源文件中从MainWindow的UI编辑QLabel。这没有意义,您应该说的是,MainWindow类的一个对象被SecondWindow类的另一个对象修改。文件不是程序的组成部分,对象之间的交互是程序的组成部分

我假设这两个对象都是在main.cpp中创建的:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w1;
    SecondWindow w2;

    w1.show();
    w2.show();

    return a.exec();
}
现在,如果我要解决主要问题,Qt处理信号和插槽的概念,因此我们将使用它,因为对
SecondWindow
对象的操作将导致发送信息,我将创建一个携带该信息的信号:

secondwindow.h

#ifndef SECONDWINDOW_H
#define SECONDWINDOW_H

#include <QWidget>

namespace Ui {
class SecondWindow;
}

class SecondWindow: public QWidget {
    Q_OBJECT

public:
    explicit SecondWindow(QWidget *parent = 0);
    ~SecondWindow();
signals:
    void messageChanged(const QString & message); // <---
private slots:
    void void SecondWindow::on_fooButton_clicked();
private:
    Ui::SecondWindow*ui;
}

#endif // SecondWindow_H
....
void setFoo(const QString & text);

现在我们到接收方,我们如何得到一个时隙,你已经完成了,但是不使用<代码> char */COD>,这是C,我们使用C++,而且我们使用QT更好,最好使用<代码> qStult<代码>:

main window.h

#ifndef SECONDWINDOW_H
#define SECONDWINDOW_H

#include <QWidget>

namespace Ui {
class SecondWindow;
}

class SecondWindow: public QWidget {
    Q_OBJECT

public:
    explicit SecondWindow(QWidget *parent = 0);
    ~SecondWindow();
signals:
    void messageChanged(const QString & message); // <---
private slots:
    void void SecondWindow::on_fooButton_clicked();
private:
    Ui::SecondWindow*ui;
}

#endif // SecondWindow_H
....
void setFoo(const QString & text);
main window.cpp

...
void SecondWindow::on_fooButton_clicked() {
    emit messageChanged("example");//The method is private so this is not possible, but this is my goal
}
...
void MainWindow::setFoo(const QString & text) {
    ui->fooLabel->setText(text);
}
最后,我们建立联系:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w1;
    SecondWindow w2;

    QObject::connect(&w2, &SecondWindow::messageChanged, &w1, &MainWindow::setFoo); 

    w1.show();
    w2.show();

    return a.exec();
}
更新:

void MainWindow::keyPressEvent(QKeyEvent *event) {
    switch (event->key()) {
        case Qt::Key_A:
        if (event->modifiers()==Qt::ShiftModifier) {
            SecondWindow*secwind= new SecondWindow();
            connect(secwind, &SecondWindow::messageChanged, this, &MainWindow::setFoo);
            secwind->show();
        }
        break;
    }
}

在哪里创建这些类的对象?实际上,
MainWindow::setFoo
是公共的。可能会将指向
main窗口的指针传递到
SecondWindow
中,并使用该指针调用
setFoo
可能重复的谢谢,一切都很正常。我唯一的问题是没有在main()函数中创建secondwindow。它在按键事件中被调用(对不起,我应该指定它)。如何访问main()函数的主窗口,以便在keyPressEvent中使用“connect”(连接)。我感谢您的快速响应。编辑问题底部的代码。@Mr.Knot编辑您的问题并将其放在那里。请不要编辑我的答案。我无意中编辑了您的问题,对不起。我按照你的要求更新了问题。非常感谢你的帮助。现在只需要完全理解插槽和信号。
...
void MainWindow::setFoo(const QString & text) {
    ui->fooLabel->setText(text);
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w1;
    SecondWindow w2;

    QObject::connect(&w2, &SecondWindow::messageChanged, &w1, &MainWindow::setFoo); 

    w1.show();
    w2.show();

    return a.exec();
}
void MainWindow::keyPressEvent(QKeyEvent *event) {
    switch (event->key()) {
        case Qt::Key_A:
        if (event->modifiers()==Qt::ShiftModifier) {
            SecondWindow*secwind= new SecondWindow();
            connect(secwind, &SecondWindow::messageChanged, this, &MainWindow::setFoo);
            secwind->show();
        }
        break;
    }
}