Я хочу получить доступ к элементам пользовательского интерфейса в главном окне из класса 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();
}
Но в этот момент вы, вероятно, могли бы использовать облегченную структуру внедрения зависимостей. Или, по крайней мере, подумайте об этом, узнав, как они работают и как их использовать.