我正在尝试从新线程更改文本字段,但不能( 我上课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的值正在变化,但它没有在屏幕上显示,谢谢。
答案 0 :(得分:0)
您需要建立更多连接。你start()
线程,但没有做任何事情,它执行线程的默认run()
函数,除非你重载它,否则什么都不做。您需要将线程的started()
信号连接到您的类Started()
函数。
我觉得睡觉有问题。睡眠阻塞线程,你需要线程运行,以便事件循环旋转,因为事件循环是不同线程中对象之间的通信。
有关非阻塞工作程序的示例,请参阅here。请注意,您不再直接使用循环,而是需要将它们分解为沿事件循环运行的抽象循环。