В ООП взаимодействующими являются объекты, а не классы или файлы, то есть следующее выражение: Мне нужно отредактировать QLabel из пользовательского интерфейса MainWindow в другом исходном файле Это не имеет смысла вы должны сказать, что объект класса MainWindow изменен другим объектом класса SecondWindow. Файлы не делают программу, взаимодействие между объектами делает это.
Я предполагаю, что оба объекта созданы в main.cpp:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w1;
SecondWindow w2;
w1.show();
w2.show();
return a.exec();
}
Теперь, если я пойду, чтобы атаковать основную проблему, Qt обрабатывает концепцию сигналов и слотов, поэтому мы будем использовать ее, так как действие на объект SecondWindow
приведет к отправке информации, я создам сигнал которая несет эту информацию:
secondwindow.h
#ifndef SECONDWINDOW_H
#define SECONDWINDOW_H
#include <QWidget>
namespace Ui {
class SecondWindow;
}
class SecondWindow: public QWidget {
Q_OBJECT
public:
explicit SecondWindow(QWidget *parent = 0);
~SecondWindow();
signals:
void messageChanged(const QString & message); // <---
private slots:
void void SecondWindow::on_fooButton_clicked();
private:
Ui::SecondWindow*ui;
}
#endif // SecondWindow_H
при нажатии кнопки должен подаваться сигнал с информацией
secondwindow.cpp
...
void SecondWindow::on_fooButton_clicked() {
emit messageChanged("example");//The method is private so this is not possible, but this is my goal
}
Теперь перейдем к получателю, как мы получим слоты, вы сделали это, но не используете char *
, это C, мы используем C ++ и намного лучше, мы используем Qt, лучше всего используйте QString
:
mainwindow.h
....
void setFoo(const QString & text);
mainwindow.cpp
...
void MainWindow::setFoo(const QString & text) {
ui->fooLabel->setText(text);
}
И, наконец, мы устанавливаем соединения:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w1;
SecondWindow w2;
QObject::connect(&w2, &SecondWindow::messageChanged, &w1, &MainWindow::setFoo);
w1.show();
w2.show();
return a.exec();
}
Обновление:
void MainWindow::keyPressEvent(QKeyEvent *event) {
switch (event->key()) {
case Qt::Key_A:
if (event->modifiers()==Qt::ShiftModifier) {
SecondWindow*secwind= new SecondWindow();
connect(secwind, &SecondWindow::messageChanged, this, &MainWindow::setFoo);
secwind->show();
}
break;
}
}