簡體   English   中英

從另一個班級Qt訪問班級

[英]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 (或類似的函數或注入依賴框架),這就是連接所屬的地方-畢竟,這是使文本傳遞具體而不再是抽象的地方操作:將Class1MainWindow綁定在它們的外部,以最小化它們的耦合:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM