如何从新线程 QML QT c++ 更改文本字段

How to change text field from new thread QML QT c++

本文关键字:c++ QT 字段 文本 QML 新线程 线程      更新时间:2023-10-16

我正在尝试从新线程更改文本字段,但不能(我有我的线程类:

class MyThread : public QObject
{
 Q_OBJECT
 Q_PROPERTY(QString firstNumber READ GetFirstNumber WRITE SetFirstNumber NOTIFY firstNumberChanged)
 private:
   QThread *thread;
   NewClass *newCLass;
   QString firstNumber;
 private slots:
   void StartThread();
   void UpdateFirstValue (int i);
 public:
   explicit MyThread(QObject *parent = nullptr);
   QString GetFirstNumber();
   void SetFirstNumber(QString);
 signals:
   void firstNumberChanged();
}

启动线程功能:

void MyThread::StartThread() 
{
  thread = new QThread;
  newClass = new NewClass();
  newClass->moveToThread(thread);
  connect(newClass, SIGNAL(sendfirstvalue(int)), this, SLOT(UpdateFirstValue(int)));
  connect(thread, SIGNAL(started()), newClass, SLOT(Start()));
  thread->start();
} 

更改文本字段:

void MyThread::UpdateFirstValue (int i)
{
  firstNumber = QString::number(i);
  emit firstNumberChanged();
}

NewClass 中的函数,即在线程中工作:

void NewClass::Start()
{
   for(int i = 0; i < 3; i++)
   {
     emit sendfirstvalue(i);
     Sleep(1000);
   }
}

使用 QML 绑定类 MyThread:

qmlRegisterType<MyThread>("NameModule", 1, 0, "TypeName");

QML 文件:

import QtQuick 2.0
import QtQuick.Layouts 1.1
import NameModule 1.0
Rectangle {
id: content
TypeName{
    id: obj
}
ColumnLayout {
  height: parent.height
  anchors.horizontalCenter: content.horizontalCenter
  Rectangle {
    Layout.fillHeight: true
    Text {
        anchors.horizontalCenter: parent.horizontalCenter
        id: firstNumber
        text: "f = " + obj.firstNumber
        font.bold: true
        onTextChanged: {
            console.log("firstNumberChanged");
        }
    }
  }
}

函数正在工作,firstNumber 的值正在更改,但它没有显示在屏幕上,谢谢。

你需要建立更多的联系。您start()线程,但这什么也不做,它会执行线程的默认run()函数,除非您将其重载,否则该函数不会执行任何操作。您需要将线程的started()信号连接到类Started()函数。

我认为睡眠有问题。睡眠会阻塞线程,您需要线程运行,以便事件循环旋转,因为事件循环是不同线程中对象之间的通信。

有关非阻塞辅助角色的示例,请参阅此处。请注意,您不再直接使用循环,而是需要将它们分解为沿事件循环运行的抽象循环。