如何从另一个 qdialog 的主窗口访问 ui?

Posted

技术标签:

【中文标题】如何从另一个 qdialog 的主窗口访问 ui?【英文标题】:How to access ui from main window in another qdialog? 【发布时间】:2020-03-09 05:50:21 【问题描述】:

我在以另一种形式从主窗口访问 QTextEdit 时遇到问题。请帮忙。

void properties::on_okWordPushButton_clicked()

    if (ui->wordcombo->currentText() == "All Words") 

        int wordCount = notepad->textEdit->toPlainText().split(QRegExp("(\\s|\\n|\\r)+"), QString::SkipEmptyParts).count();
        ui->wordcountlabel->setText(QString::number(wordCount));

    

我收到一个错误,因为我无法阅读记事本->textEdit

【问题讨论】:

提供minimal reproducible example 语义问题。 31:25 '记事本' 不指代值。我已经包含了“notepad.h”和“ui_notepad.h”,并且记事本实例设置为公共。如果有帮助,我可以分享我的整个文件。 不要传递整个 ui,而是连接窗口和对话框,并使用信号槽来传递所需的最少数据 这可以通过在两个窗口/窗体之间使用signal/slot来完成。 【参考方案1】:

您至少可以使用两种可能性:

    肮脏的方式: 在创建表单时,将指针传递给您的 QTextEdit:
// mainwindow.cpp
auto myProperties = new properties(notepad->textEdit);
...

// properties.h
QTextEdit *outerEditor;

// properties.cpp
properties::properties(QTextEdit *editor) 
 outerEditor = editor;
 ...

然后,在您的插槽上,您可以使用:

int wordCount = editor->toPlainText().split(QRegExp("(\\s|\\n|\\r)+"), QString::SkipEmptyParts).count();
    Qt 方式: 请记住 - 信号/插槽非常棒。

在创建表单后,您可以将来自 MainWindow 的信号连接到在 QTextEdit 中传递文本的属性并将其存储在本地:

// MainWindow.cpp
auto myProperties = new properties(notepad->textEdit);
connect(this->textEdit, QOverload<QString>::of(&QTextEdit::valueChanged), myProperties, GetNewValue);

// properties.h
void GetNewValue(QString val);

// properties.cpp
void properties::GetNewValue(QString val) 
    ui->wordcountlabel->setText(QString::number(val.toPlainText().split(QRegExp("(\\s|\\n|\\r)+"), QString::SkipEmptyParts).count());

【讨论】:

【参考方案2】:

你不能这样做,ui 是一个小部件的私有成员,创建一个返回或设置你需要的函数!

【讨论】:

以上是关于如何从另一个 qdialog 的主窗口访问 ui?的主要内容,如果未能解决你的问题,请参考以下文章

隐藏 qdialog 并显示主窗口

关闭 QDialog 窗口是不是会删除其动态添加的 UI 元素?

如何覆盖 QDialog.accept()?

Qt5从另一个类访问ui [重复]

c#如何从另一个窗口中更改主窗口控件的属性

如何在其他 .py 模块中打开 Qdialog