如何在Qt中的类之间发送变量

时间:2019-05-08 19:42:19

标签: c++ qt

我有问题。我在Qt项目中创建了两个类。一个作为主窗口,第二个作为设置对话框。我的想法是将值从“设置”发送到“ MainWindow”(例如从一个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 个答案:

答案 0 :(得分:2)

使用信号/时隙机制在两个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 :(得分:1)

有多种方法可以实现这一目标。 例如,您可以在对话框中提供公共Getter方法,以向公众提供价值,并直接在MainWindow中使用它们来读取这些方法。

或者您可以如上所述使用信号/插槽。 信号/插槽的一个示例: 如果接受对话框,则SettingsWindow 发出textEdit(QString)信号,并且MainWindow通过 on_textEdit(QString)插槽接收该信号并将其写入其自己的文本字段:

SettingsWindow读取文本输入并发出信号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());
}

More about Signal/Slots

答案 2 :(得分:0)

如果包含.cpp文件,则应该能够访问全局声明的变量。