Доступ к классу из другого класса Qt - PullRequest
0 голосов
/ 28 июня 2018

У меня есть два класса (mainwindow & class1), которые не связаны, поэтому объекты друг друга не создаются в классах. Я хочу получить доступ к элементам пользовательского интерфейса в mainwindow из class1. Я попытался использовать сигнал и слот, но для этого мне пришлось создать объект класса 1 в главном окне. Есть предложения по этой проблеме? Одна идея - записать адрес объекта mainwindow в текстовый файл и прочитать его, чтобы указать этот адрес из class1. Может ли это быть решением? Если да, как я могу это сделать? Я попробовал следующий код для проверки, но не работает.

MainWindow *mainObject = 0x7fffa9574290;

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Я хочу получить доступ к элементам пользовательского интерфейса в главном окне из класса 1

Нет, нет. Элементы пользовательского интерфейса в mainwindow являются деталями реализации. Они не имеют отношения к другим классам. Интерфейс должен быть общим и не привязанным к элементам пользовательского интерфейса и должен отражать функциональность, а не реализацию. Скажите, что mainwindow предоставляет интерфейс для некоторого текста. Вы хотели бы уведомить любого, кому небезразлично, что текст действительно был изменен. Таким образом:

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();
}

Но в этот момент вы, вероятно, могли бы использовать облегченную структуру внедрения зависимостей. Или, по крайней мере, подумайте об этом, узнав, как они работают и как их использовать.

0 голосов
/ 28 июня 2018

Вы должны рассказать одному классу о другом. Так что, если class1 создан до mainwindow, тогда передайте его в качестве аргумента конструктору. Если он был создан позже, то почему бы не создать его в mainwindow, а затем получить ссылку на class1 из mainwindow вместо создания второго экземпляра. Или сделайте class1 глобальным / синглтоном. Таким образом, каждый может запросить один экземпляр class1, и первый может его создать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...