从另一个班级Qt访问班级

时间:2018-06-28 10:48:15

标签: c++ qt

我有两个未连接的类(mainwindow和class1),因此在这些类中不创建彼此的对象。我想从class1访问mainwindow中的ui元素。我尝试使用signal&slot,但要这样做,我必须在mainwindow中创建一个class1对象。对这个问题有什么建议吗?一种想法是将mainwindow对象的地址写入文本文件,然后读取它以指向class1中的该地址。这可以解决吗? 如果是,我该怎么办?我尝试按照以下代码进行测试,但无法正常工作。

MainWindow *mainObject = 0x7fffa9574290;

2 个答案:

答案 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的主体(或类似的函数或注入依赖项框架),这是连接所属的地方-毕竟,这是您编写文本的地方通过具体的操作而不再是抽象的操作:将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();
}

但是到那时,您可能可以使用轻量级的依赖注入框架。或者至少通过学习它们的工作原理和使用方法来加以考虑。