[英]Accessing a class from another class Qt
我有兩個未連接的類(mainwindow和class1),因此在這些類中不創建彼此的對象。 我想從class1訪問mainwindow中的ui元素。 我嘗試使用signal&slot,但要這樣做,我必須在mainwindow中創建一個class1對象。 對這個問題有什么建議嗎? 一種想法是將mainwindow對象的地址寫入文本文件,然后讀取它以指向class1中的該地址。 這可以解決嗎? 如果是,我該怎么辦? 我嘗試按照以下代碼進行測試,但無法正常工作。
MainWindow *mainObject = 0x7fffa9574290;
您必須告訴一個班級另一班。 因此,如果class1在mainwindow之前創建,則將其作為參數傳遞給構造函數。 如果我稍后創建它,那為什么不在mainwindow中創建它,然后再從mainwindow中獲得對class1的引用,而不是創建第二個實例。 或將class1設為全局/單例。 這樣,任何人都可以要求一個class1實例,而第一個實例可以創建它。
我想從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();
}
但是到那時,您可能會使用輕量級的依賴注入框架。 或者至少通過學習它們如何工作以及如何使用它們來加以考慮。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.