Как отправить переменные между классами в Qt - PullRequest
0 голосов
/ 08 мая 2019

У меня проблема. Я создал два класса в своем проекте Qt. Один как главное окно, а второй как диалог настроек. Моя идея состоит в том, чтобы отправить значения из «Настройки» в «Главное окно» (как из одного TextEdit в другой), но, к сожалению, я понятия не имею, как это сделать. Это меня смущает. Я читал подобные темы в Интернете, но ни одна из них не дает мне четкого ответа. Может кто-нибудь помочь мне понять, как я могу сделать это на примере?

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

mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    [...]
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>       
#include "settings.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow()
    [...]
private:
    Ui::MainWindow *ui;
    [...]
};
#endif // MAINWINDOW_H

settings.cpp

#include "settings.h"
#include "ui_settings.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

settings.h

#ifndef SETTINGS_H
#define SETTINGS_H

#include <QDialog>

namespace Ui {
class Settings;
}


class Settings : public QDialog
{
    Q_OBJECT

public:
    explicit Settings(QWidget *parent = nullptr);
    ~Settings();
    [...]
private:
    Ui::Settings *ui;
    [...]
};
#endif // SETTINGS_H

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

Ответы [ 3 ]

2 голосов
/ 08 мая 2019

Используйте механизм сигналов / слотов для разделения значений между двумя QObject.

Например:

Следующий код позволяет отправить значение в QLineEdit другому виджету, нажав кнопку:

class Widget1: public QWidget
{
    Q_OBJECT
public:
    Widget1(): QWidget(),
        message(new QLineEdit())
    {
        QPushButton* button = new QPushButton("Send msg", this);
        connect(button, &QPushButton::clicked, this, [=]() { emit this->sendMsg(message->text());}); // When you click on the button, it will emit the signal sendMsg

        QVBoxLayout* layout = new QVBoxLayout(this);
        layout->addWidget(message);
        layout->addWidget(button);
    }
private:
    QLineEdit* message;
signals:
    void sendMsg(QString const& msg);
};
class Widget2: public QWidget
{
    Q_OBJECT
public:
    Widget2(): QWidget(),
        display(new QLabel("Nothing to display", this))
    {
        QVBoxLayout* layout = new QVBoxLayout(this);
        layout->addWidget(display);
    }
private:
    QLabel* display;
public slots:
    void receive(QString const& message)
    {
        display->setText(message); // When called, display the message in the label
    }
};
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget* mainWidget = new QWidget();
    QHBoxLayout* layout = new QHBoxLayout(mainWidget);

    Widget1* w1 = new Widget1();
    Widget2* w2 = new Widget2();
    layout->addWidget(w1);
    layout->addWidget(w2);

    // When the signal sendMsg is emitted, call the slot receive
    QObject::connect(w1, &Widget1::sendMsg, w2, &Widget2::receive);

    mainWidget->show();
    return app.exec();
}
1 голос
/ 08 мая 2019

Есть несколько способов добиться этого. Например, вы можете предоставить общедоступные методы Getter в своем диалоговом окне, чтобы предоставить значение для публики, и использовать их непосредственно в MainWindow для их чтения.

Или вы можете использовать Сигналы / Слоты, как указано выше. Один пример с сигналом / слотами: SettingsWindow испускает сигнал textEdit (QString) , если Dialog Accepted, и MainWindow принимает этот сигнал через on_textEdit (QString) слот и записывает его в свое собственное текстовое поле:

Настройки чтения окна ввода текста и выдачи сигнала textEdit (QString): enter image description here

MainWindow принимает сигнал через слот on_textEdit (QString): enter image description here

А это код:

maindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    void on_textEdited(QString txt);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "settingsdialog.h"
#include <memory>

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

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

void MainWindow::on_pushButton_clicked()
{
    auto dlg = new SettingsDialog{this};
    connect(dlg, &SettingsDialog::textEdit, this, &MainWindow::on_textEdited);
    dlg->setAttribute(Qt::WA_DeleteOnClose);
    dlg->show();
}

void MainWindow::on_textEdited(QString txt)
{
    ui->textEdit->setText(txt);
}

settingsdialog.h

#ifndef SETTINGSDIALOG_H
#define SETTINGSDIALOG_H

#include <QDialog>

namespace Ui {
class SettingsDialog;
}

class SettingsDialog : public QDialog
{
    Q_OBJECT

public:
    explicit SettingsDialog(QWidget *parent = nullptr);
    ~SettingsDialog();

signals:
    void textEdit(QString txt);

private slots:
    void on_buttonBox_accepted();

private:
    Ui::SettingsDialog *ui;
};

#endif // SETTINGSDIALOG_H

settingsdialog.cpp

#include "settingsdialog.h"
#include "ui_settingsdialog.h"

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

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

void SettingsDialog::on_buttonBox_accepted()
{
   emit textEdit(ui->textEdit->toPlainText());
}

Подробнее о Сигнале / Слотах

0 голосов
/ 08 мая 2019

Вы сможете получить доступ к глобально объявленным переменным, если включите файлы .cpp.

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