我在一个专用插槽中有一个QTextEdit小部件,我经常用setText()和insertPlainText()更新它。
我发现setText()/insertPlainText()没有立即更新QTextEdit小部件。相反,当槽函数返回时,将更新QTextWidget。为了测试这一点,我在setText()/insertPlainText()之后放了一个test ()。
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。
发布于 2019-06-15 00:22:19
永远不要执行在GUI线程中消耗大量时间的任务。通常,解决方案是在另一个线程中执行该任务,但在您的示例中,它表明您使用的是QProcess,因此我假设您使用的是waitForFinished()、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"
发布于 2019-06-15 20:07:37
我想知道是否打电话
QCoreApplication::processEvents()
就在->setText(“样例文本”)之后,在您的情况下就可以做到这一点。
https://stackoverflow.com/questions/56606263
复制相似问题