Как мне отредактировать виджет пользовательского интерфейса QMainWindow из другого класса? - PullRequest
0 голосов
/ 26 июня 2018

Мне нужно отредактировать QLabel из пользовательского интерфейса MainWindow в другом исходном файле. Я пытался возиться с синглами и слотами, но, честно говоря, я полностью потерян, и документация Qt не помогает мне в этой конкретной ситуации. Я понимаю, что это было задано в прошлом, но я не нашел решение, которое работает для меня. Я новичок в Qt и C ++ в целом.

У меня есть следующий код (очень упрощенный):

"mainwindow.h":

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void setFoo(char* text);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

"mainwindow.cpp"

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow) {
    ui->setupUi(this);
    this->statusBar()->setSizeGripEnabled(false);
}

MainWindow::~MainWindow() {
    delete ui;
}

void MainWindow::setFoo(char* text) {
    ui->fooLabel->setText(text);
}

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

private:
    Ui::SecondWindow*ui;
}

#endif // SecondWindow_H

"secondwindow.cpp"

#include "secondwinodw.h"
#include "ui_secondwinodw.h"
#include "mainwindow.h"

SecondWindow::SecondWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SecondWindow) {
    ui->setupUi(this);
}

SecondWindow::~SecondWindow() {
    delete ui;
}

void SecondWindow::on_fooButton_clicked() {
    MainWindow::setFoo("example");//The method is private so this is not possible, but this is my goal
}

Когда пользователь нажимает на fooButton, мне нужно получить доступ и отредактировать интерфейс пользователя MainWindow QLabel (или публичный метод, который делает это). Второе окно не создается в функции main ()

void MainWindow::keyPressEvent(QKeyEvent *event) {
    switch (event->key()) {
        case Qt::Key_A:
        if (event->modifiers()==Qt::ShiftModifier) {
            SecondWindow*secwind= new SecondWindow();
            secwind->show();
        }
        break;
    }
}

1 Ответ

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

В ООП взаимодействующими являются объекты, а не классы или файлы, то есть следующее выражение: Мне нужно отредактировать 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;
    }
}
...