【问题标题】:How to display the input of QLineEdit in a dialog on the label of mainwindow?如何在主窗口标签的对话框中显示 QLineEdit 的输入?
【发布时间】:2019-10-28 11:35:38
【问题描述】:

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

我发现另一个question 基本相同,但对我来说必须反过来。

所以在 MainWindow.h 的头文件中我添加了 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);
}

它编译没有错误。然而,当我单击对话框中的按钮时,它不会在主窗口中打印结果...我一直在尝试寻找有关如何执行此操作的另一个示例,但还没有真正找到。那我错过了什么?或者我该怎么做?

【问题讨论】:

    标签: c++ dialog qt-creator


    【解决方案1】:

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

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

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

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

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

    我在这个例子中创建了一个对话框窗口类。

    对话框.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
    

    对话框.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);
        }
    

    【讨论】:

    • 不错!感谢这个解决方案!需要多玩一点才能知道它是如何工作的。
    • 好的,尝试向其中添加第二个 QLineEdit,但我不太明白如何执行此操作。
    • 您需要另一个连接。如果您想要不同的功能,还有另一个插槽。阅读文档或观看一些有关信号和插槽的 youtube 视频。
    • 在对这两种解决方案进行了一些试验后,我最终使用了您的解决方案而不是其他解决方案。所以我接受了你的答案而不是另一个。 qt 的 Btw 文档对我来说,非常不清楚......
    【解决方案2】:

    MainWindow MainWindow; 这一行中,您创建了一个 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);
    }
    

    【讨论】:

    • 试过这个,但它会导致崩溃。
    • @ArjanPoortman 创建时是否将指向 MainWindow 的指针作为父窗口传递给 WindowDialog ? WindowDialog dialog(this);
    • 我不太明白你的意思?我是 C++ 新手,那么我到底在哪里传递指针?
    • @ArjanPoortman 不过要小心投射这样的指针。如果你搞砸了并且父级不是MainWindow,你就会调用未定义的行为!
    • @ArjanPoortman 我添加了一个更安全的版本,如果你搞砸了,至少会引发异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多