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

时间:2015-04-13 13:23:17

标签: c++ qt inheritance widget

我有两个"表格"与相关的.cpp文件:mainwindow.cpp和settings.cpp

我有一个标签" TitleLabel"在" MainWindow"当我在"设置"。

中按下按钮时,我想要修改

文件结构如下(我删除了大部分不相关的代码以简化):

//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 '.'

我尝试添加&#39 ;;'在'之前。'但它仍然给我同样的错误。

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

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

这次它告诉我,访问MainWindow类的私有成员是不可能的。我不知道我是否应该甚至如何授予“设置”权限以访问这些成员。我感到很遗憾,我该怎么办?

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

1 个答案:

答案 0 :(得分:0)

您可以这样做:

在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();
}