如何从另一个 window 访问 window 的小部件?
How can I access a Widget of a window from another window?
我有两个 "Forms" 和相关的 .cpp 文件:mainwindow.cpp 和 settings.cpp
我在 "MainWindow" 中有一个标签 "TitleLabel",当我在 "Settings" 中按下按钮时我想修改它。
文件结构如下(为了简化,我删除了大部分不相关的代码):
//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");
}
这次它告诉我无法访问 class MainWindow 的私有成员。我不知道我是否应该甚至如何授予“设置”访问这些成员的权限。我真的很迷茫,我该怎么办?
编辑:
我能够通过使用 Qt 的 SIGNALs 和 SLOTs 来解决这个问题。
你可以这样做:
在 MainWindow 中定义 public 插槽:
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();
};
插槽应该处理这样的事情:
void Settings::clickBtn()
{
emit changeLabel("Ok");
}
并且不要忘记在“设置”小部件中为按钮连接信号和插槽:
Settings::Settings(QWidget *parent) :
QWidget(parent)
{
...
connect(pushButton, SIGNAL(clicked()), this, SLOT(clickBtn()));
}
完成此设置和 MainWindow 小部件的所有连接信号和插槽 main()
:
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();
}
我有两个 "Forms" 和相关的 .cpp 文件:mainwindow.cpp 和 settings.cpp
我在 "MainWindow" 中有一个标签 "TitleLabel",当我在 "Settings" 中按下按钮时我想修改它。
文件结构如下(为了简化,我删除了大部分不相关的代码):
//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");
}
这次它告诉我无法访问 class MainWindow 的私有成员。我不知道我是否应该甚至如何授予“设置”访问这些成员的权限。我真的很迷茫,我该怎么办?
编辑:
我能够通过使用 Qt 的 SIGNALs 和 SLOTs 来解决这个问题。
你可以这样做:
在 MainWindow 中定义 public 插槽:
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();
};
插槽应该处理这样的事情:
void Settings::clickBtn()
{
emit changeLabel("Ok");
}
并且不要忘记在“设置”小部件中为按钮连接信号和插槽:
Settings::Settings(QWidget *parent) :
QWidget(parent)
{
...
connect(pushButton, SIGNAL(clicked()), this, SLOT(clickBtn()));
}
完成此设置和 MainWindow 小部件的所有连接信号和插槽 main()
:
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();
}