如何从新线程 QML QT c++ 更改文本字段
How to change text field from new thread QML QT c++
我正在尝试从新线程更改文本字段,但不能(我有我的线程类:
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()
函数。
我认为睡眠有问题。睡眠会阻塞线程,您需要线程运行,以便事件循环旋转,因为事件循环是不同线程中对象之间的通信。
有关非阻塞辅助角色的示例,请参阅此处。请注意,您不再直接使用循环,而是需要将它们分解为沿事件循环运行的抽象循环。
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 如何在cpp文件之间切换窗口?在Qt中
- Qt和C++:将QLineEdit添加到QTabWidget中
- 从数据库实时显示QT c++中的数据
- Qt Quick-如何仅从c++代码与qml属性交互
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 如何在Qt中取消捕获字符串
- Qt SQLite没有查询或参数计数不匹配
- Qt SQlite无法创建表