Как отобразить ввод QLineEdit в диалоге на метке главного окна? - PullRequest
0 голосов
/ 28 октября 2019

Я новичок в QtCreator и создал кнопку в главном окне, которая открывает диалог. В диалоге я добавил QLineEdit и кнопку. Когда я нажимаю на эту кнопку, я хочу, чтобы введенный текст отображался на Qlabel в главном окне.

Я нашел еще один вопрос , который в основном такой же, но для меня он долженработать наоборот.

Итак, в заголовке MainWindow.hi добавили в 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);
}

Он компилируется без ошибок. Тем не менее, когда я нажимаю кнопку в диалоговом окне, результаты не выводятся в главном окне ... Я пытался найти другие примеры того, как это сделать, но пока не смог найти. Так чего мне не хватает? Или как мне заставить это работать?

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Для этого вы можете использовать сигналы и слоты. https://doc.qt.io/qt-5/signalsandslots.html

вам нужно будет подключить сигнал к слоту с помощью этой команды

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

каждый раз, когда вы хотите вызвать функцию обновления, вам просто нужно будет подать сигнал.

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

В этом примере я создал класс диалогового окна.

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);
    }
1 голос
/ 28 октября 2019

В этой строке 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);
}
...