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

时间:2017-10-08 07:56:27

标签: c++ qt qml

我正在尝试从新线程更改文本字段,但不能( 我上课MyThread:

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中运行,即在thread:

中工作
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的值正在变化,但它没有在屏幕上显示,谢谢。

1 个答案:

答案 0 :(得分:0)

您需要建立更多连接。你start()线程,但没有做任何事情,它执行线程的默认run()函数,除非你重载它,否则什么都不做。您需要将线程的started()信号连接到您的类Started()函数。

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

有关非阻塞工作程序的示例,请参阅here。请注意,您不再直接使用循环,而是需要将它们分解为沿事件循环运行的抽象循环。