我有两个未连接的类(mainwindow和class1),因此在这些类中不创建彼此的对象。我想从class1访问mainwindow中的ui元素。我尝试使用signal&slot,但要这样做,我必须在mainwindow中创建一个class1对象。对这个问题有什么建议吗?一种想法是将mainwindow对象的地址写入文本文件,然后读取它以指向class1中的该地址。这可以解决吗? 如果是,我该怎么办?我尝试按照以下代码进行测试,但无法正常工作。
MainWindow *mainObject = 0x7fffa9574290;
答案 0 :(得分:0)
您必须告诉一个班级另一个班级。因此,如果class1在mainwindow之前创建,则将其作为参数传递给构造函数。如果我稍后创建它,那为什么不在mainwindow中创建它,然后再从mainwindow中获得对class1的引用,而不是创建第二个实例。或将class1设为全局/单例。这样,任何人都可以要求一个class1实例,而第一个实例可以创建它。
答案 1 :(得分:0)
我想从class1访问mainwindow中的ui元素
不,你不知道。 mainwindow
中的ui元素是实现细节。他们与其他班级无关。接口应该是通用的,不应与ui元素绑定,并且应该反映功能而不是实现。假设mainwindow
正在为某些文本提供UI。您想通知任何关心文本确实已更改的人。因此:
class MainWindow : public QMainWindow {
Q_OBJECT
Ui::MainWindow ui;
...
public:
Q_SIGNAL void myTextChanged(const QString &);
QString myText() const { return ui.myTextWidget->text(); }
...
};
然后,class1
应该有一种被告知文本内容的方式:
class Class1 : public QObject {
Q_OBJECT
...
public:
Q_SLOT void setMyText(const QString &);
...
};
唯一了解这两个类的信息的地方是main
的主体(或类似的函数或注入依赖项框架),这是连接所属的地方-毕竟,这是您编写文本的地方通过具体的操作而不再是抽象的操作:将Class1
和MainWindow
绑在它们外面,以最小化它们的耦合:
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MainWindow win;
Class1 obj;
connect(&win, &MainWindow::myTextChanged, &obj, &Class1::setMyText);
obj.setMyText(win.myText());
win.show();
return app.exec();
}
当然,如果您不希望所有内容都位于main
的可怜主体中(为什么?),则可以将其全部委托给一个代表应用程序主要对象组成的类。 :
class AppComposition {
MainWindow win;
Class1 obj;
...
public:
AppComposition() {
connect(&win, &MainWindow::myTextChanged, &obj, &Class1::setMyText);
obj.setMyText(win.myText());
...
}
void show() {
win.show();
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
AppComposition comp;
comp.show();
return app.exec();
}
但是到那时,您可能可以使用轻量级的依赖注入框架。或者至少通过学习它们的工作原理和使用方法来加以考虑。