如何在主窗口标签的对话框中显示QLineEdit的输入?

How to display the input of QLineEdit in a dialog on the label of mainwindow?

我是 QtCreator 的新手,在主窗口上创建了一个用于打开对话框的按钮。在对话框中我添加了 QLineEdit 和一个按钮。当我点击这个按钮时,我希望输入的文本显示在主窗口的 Qlabel 上。

我找到了另一个 ,它基本上是一样的,但对我来说,它必须以相反的方式工作。

所以在 MainWindow.h 的 header 我已经添加到 public:

void setLabelText(QString str);

我创建了 getter/setter 函数并将其添加到 MainWindow.cpp:

void MainWindow::setLabelText(QString str)
{
    ui->label->setText(str);//it is label dialog

}

并且在 windowdialog.cpp 按钮下添加了 click() 插槽:

void WindowDialog::on_pushButton_clicked()
{
    QString str = ui->lineEdit->text();
    MainWindow MainWindow;
    MainWindow.setLabelText(str);
}

它编译没有错误。然而,当我点击对话框中的按钮时,它不会在主窗口中打印结果......我一直在试图找到另一个关于如何做到这一点的例子,但还没有真正找到一个。那我错过了什么?或者我该如何完成这项工作?

在这一行 MainWindow MainWindow; 中,您创建了一个 new MainWindow,但您想在现有的 MainWindow 上设置文本。

相反,您可能希望在创建对话框后将 MainWindow 的引用或指针传递给对话框。

如果您将 MainWindow 作为 QDialog 的父级传递,您可以这样做:

void WindowDialog::on_pushButton_clicked()
{
    QString str = ui->lineEdit->text();
    static_cast<MainWindow*>(parent())->setLabelText(str);
}

使用 dynamic_cast 的更安全版本:

void WindowDialog::on_pushButton_clicked()
{
    QString str = ui->lineEdit->text();
    MainWindow* window = dynamic_cast<MainWindow*>(parent());
    if (!window) {
        throw std::runtime_error{"Parent was not a MainWindow"};
    }
    window->setLabelText(str);
}

您可以为此使用信号和槽。 https://doc.qt.io/qt-5/signalsandslots.html

您需要使用此命令将信号连接到插槽

connect(dlg,&DialogWindow::transmit,this,&MainWindow::update);

任何时候你想调用更新函数,你只需要发出信号。

emit transmit(ui->lineEdit->text());

我在这个例子中创建了一个对话框 window class。

Dialog.h

    #ifndef DIALOGWINDOW_H
    #define DIALOGWINDOW_H

    #include <QDialog>

    QT_BEGIN_NAMESPACE
    namespace Ui { class Dialog;   }

    QT_END_NAMESPACE

    class DialogWindow : public QDialog
    {
        Q_OBJECT

    public:
        DialogWindow(QWidget *parent = nullptr);
        ~DialogWindow();

    signals:
        void transmit(QString txt);

    private slots:


        void on_buttonBox_accepted();

    private:

        Ui::Dialog *ui;
    };

    #endif // DIALOGWINDOW_H

Dialog.cpp

    #include "dialog.h"
    #include "ui_dialog.h"

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

    DialogWindow::~DialogWindow()
    {

    }

    void DialogWindow::on_buttonBox_accepted()
    {
        emit transmit(ui->lineEdit->text());
    }

MainWindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

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

    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE

    class MainWindow : public QMainWindow
    {
        Q_OBJECT

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

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

    private:
        Ui::MainWindow   *ui;
        DialogWindow    *dlg;
    };

    #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);

        dlg = new DialogWindow(NULL);

        connect(dlg,&DialogWindow::transmit,this,&MainWindow::update);

    }

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


    void MainWindow::on_pushButton_clicked()
    {
        dlg->show();
    }

    void MainWindow::update(QString txt)
    {
        ui->label->setText(txt);
    }