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

时间:2015-01-06 12:30:23

标签: c++ qt qt4

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

现在,我已将输入存储在变量中,并且我还能够在同一主窗口的标签上显示此字符串,

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

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

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

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

3 个答案:

答案 0 :(得分:3)

情况

所以这是你的情况:

enter image description here

在您的代码中,对话框为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();          

解决方案

要使对话框显示窗口中的文本,

  

概念是从窗口传递信息(文本)   到对话框,并使用对话框中的设置器功能来显示它。

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

此功能的实施细节由切尔诺贝利的答案补充(改为使用名称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&从答案中粘贴" 代码并将其作为最终解决方案,这是不对的。所以我希望这个摘要可以帮助您理解这个概念,然后您可以编写自己的代码

答案 1 :(得分:1)

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

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

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

然后你可以这样称呼它:

SecDialog secdialog(this, mytext);

答案 2 :(得分:1)

使用getter / setter方法或使用信号和插槽可以轻松完成此任务,但此处更适合setter。在SecDialog标题中:

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

用法:

secDialog.setLabelText(myText);

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

  

此属性保持show()是否应将对话框弹出为模态   或无模式。默认情况下,此属性为false,并弹出show()   对话无模式。将其属性设置为true等同于   将QWidget :: windowModality设置为Qt :: ApplicationModal。的 EXEC()   忽略此属性的值,并始终弹出对话框   模态的。