在不同的 window 和/或对话框中显示 QLineEdit 的输入?

Display the input of QLineEdit in a different window and or dialog?

我正在编写一个小型 QT gui 应用程序,其中在我的 mainwindow.ui 中有一个 QLineEdit,我想在一个单独的对话框中显示输入的文本,或者 window 当按下一个按钮时。

现在,我已将输入存储在一个变量中,而且我还能够在同一个 mainwindow、

中的标签上显示该字符串
void MainWindow::on_GoButton_clicked()
{
    QString mytext = ui->lineEdit_1->text();
    ui->label_1->setText(mytext);
}

现在,我想打开一个弹出对话框(也可以是 window),例如 SecDialog;

SecDialog secdialog;
secdialog.setModal(true);
secdialog.exec();

并在SecDialog的标签中显示mainwindow->mytext字符串变量的文本。我怎样才能做到这一点 ???我知道这是一个基本水平的问题,但我认为这将有助于消除我对在表单和类之间移动变量值的疑虑。

假设 SecDialog 也是带有接口文件的自定义 class,您可能希望将其作为构造函数参数传递或使用其他函数传递。

所以在 SecDialog 构造函数中你可以有这样的东西:

SecDialog::SecDialog(QWidget* parent, const QString& myString)
    : QDialog(parent),
    theStringInThisClass(myString) 
{}

然后你可以这样称呼它:

SecDialog secdialog(this, mytext);

这个任务可以用getter/setter方法或者用信号槽轻松完成,但是setter更适合这里。在 SecDialog header:

public:
void setLabelText(QString str);
//in cpp 
void SecDialog::setLabelText(QString str)
{
    ui->label->setText(str);//it is label dialog
}

用法:

secDialog.setLabelText(myText);

也不需要将模态设置为 true 的行,因为

This property holds whether show() should pop up the dialog as modal or modeless. By default, this property is false and show() pops up the dialog as modeless. Setting his property to true is equivalent to setting QWidget::windowModality to Qt::ApplicationModal. exec() ignores the value of this property and always pops up the dialog as modal.

情况

所以这是你的情况:

根据您的代码,对话框是 modal dialog:

SecDialog secdialog;
//secdialog.setModal(true); // It's not needed since you already called exec(), and the 
                            // dialog will be automatically set to be modal just like what
                            // document says in Chernobyl's answer 

secdialog.exec();          

解决方案

使对话框显示来自 Window、

的文本

the concept is to pass the information(text) from the Window to the dialog, and use a setter function from the dialog to display it.

Floris Velleman 的回答一样,他将 mytext 字符串(通过引用)传递给自定义对话框构造函数并调用 setter theStringInThisClass(myString) 一次。

此函数的实现细节由 Chernobyl 的回答(使用名称 setLabelText 代替)补充:

void SecDialog::setLabelText(QString str)
{
    ui->label->setText(str); // this "ui" is the UI namespace of the dialog itself.
                             // If you create the dialog by designer, it's from dialog.ui
                             // Do not confuse with the ui from mainwindow.ui
}

切尔诺贝利 提出了另一种在槽函数中调用 setter 的方法,它绕过了定义另一个构造函数的需要,但基本上概念是相同的:

void MainWindow::on_GoButton_clicked()
{
    QString mytext = ui->lineEdit_1->text();
    ui->label_1->setText(mytext);
    SecDialog secdialog;

    secdialog.setLabelText(myText); // display the text in dialog

    secdialog.exec();
}

评论

我试图尽可能清楚地说明这个概念,因为根据我以前对你问题的经验,你只是 "copy & paste" 答案中的代码并将它们作为你的答案最终解决方案,这是不对的。所以我希望这个总结能帮助你理解这个概念,然后你可以编写你自己的代码