QTextEdit refresh after setText()/insertPlainText()



我有一个QTextEdit小部件在一个私人插槽中,我定期使用setText((和insertPlainText((更新它。

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

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;
}

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

有谁知道如何让 QTextEdit 小部件在 setText((/insertPlainText(( 之后立即显示其内容?

在 Fedora 29 上使用 Qt5。

切勿执行在 GUI 线程中消耗大量时间的任务。一般来说,解决方案是在另一个线程中执行该任务,但在你的情况下,它表明你使用 QProcess,所以我假设你正在使用方法之一 waitForDone((、waitForStarted(( 或 waitForReadyRead((,而不是你应该使用信号:

#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"

我想知道是否调用

QCoreApplication::processEvents() 

紧随 ->setText("示例文本"(之后,可以在您的情况下解决问题。

相关内容

  • 没有找到相关文章