首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QTextEdit在setText()/insertPlainText()之后刷新

QTextEdit在setText()/insertPlainText()之后刷新
EN

Stack Overflow用户
提问于 2019-06-14 23:53:29
回答 2查看 1.6K关注 0票数 1

我在一个专用插槽中有一个QTextEdit小部件,我经常用setText()和insertPlainText()更新它。

我发现setText()/insertPlainText()没有立即更新QTextEdit小部件。相反,当槽函数返回时,将更新QTextWidget。为了测试这一点,我在setText()/insertPlainText()之后放了一个test ()。

代码语言:javascript
运行
复制
class MyWindow : public Widget
{
    MyWindow()
    {
        my_button = new QPushButton(this);
        my_edit   = new QTextEdit(this);

        connect(my_button, 
                &QPushButton::clicked, 
                this, 
                &MyWindow::my_callback);
    }

    private slots:

        void my_callback()
        {
            my_edit->setText("sample text");

            // nothing happens; the QTextEdit 
            // widget does not show "sample text"

            sleep(10); 

            // the QTextEdit widget will show
            // "sample text" AFTER the sleep,
            // when my_callback returns.
         }

    private:
        QPushButton* my_button;
        QTextEdit*   my_edit;
}

这对我来说是个问题,因为在启动一个耗时的过程(使用QTextEdit )之前,我需要在我的QProcess小部件中打印一条消息。目前,直到QProcess进程返回之后才会打印此消息。

有人知道如何让QTextEdit小部件在setText()/insertPlainText()之后显示其内容吗?

在Fedora 29上使用Qt5。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-15 00:22:19

永远不要执行在GUI线程中消耗大量时间的任务。通常,解决方案是在另一个线程中执行该任务,但在您的示例中,它表明您使用的是QProcess,因此我假设您使用的是waitForFinished()、waitForStarted()或waitForReadyRead()方法之一,而应该使用信号:

代码语言:javascript
运行
复制
#include <QtWidgets>

class Widget: public QWidget{
    Q_OBJECT
public:
    Widget(QWidget *parent=nullptr):
        QWidget(parent)
    {
        button.setText("Press me");
        QVBoxLayout *lay = new QVBoxLayout{this};
        lay->addWidget(&button);
        lay->addWidget(&textedit);
        connect(&button, &QPushButton::clicked, this, &Widget::onClicked);
        connect(&process, &QProcess::readyReadStandardError, this, &Widget::onReadyReadStandardError);
        connect(&process, &QProcess::readyReadStandardOutput, this, &Widget::onReadAllStandardOutput);
    }
private Q_SLOTS:
    void onClicked(){
        textedit.setText("sample text");
        process.start("ping 8.8.8.8");
    }
    void onReadyReadStandardError(){
        textedit.append(process.readAllStandardError());
    }
    void onReadAllStandardOutput(){
        textedit.append(process.readAllStandardOutput());
    }
private:
    QPushButton button;
    QTextEdit textedit;
    QProcess process;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
#include "main.moc"
票数 2
EN

Stack Overflow用户

发布于 2019-06-15 20:07:37

我想知道是否打电话

代码语言:javascript
运行
复制
QCoreApplication::processEvents() 

就在->setText(“样例文本”)之后,在您的情况下就可以做到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56606263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档