QT-How 将 QWidget 与 QThread 一起使用?
QT-How to utilize QWidget with QThread?
我正在通过 QT 制作一些 GUI。
我几乎完成了我的工作,但我很难处理 Qthread。
我的目标是测量电机的位置(它移动)并将其显示在 Qtextbrowser 上,同时在主线程中运行另一个函数。当我编写如下代码时,人们说我不能在线程中直接使用 QTextBrowser(Qwidget),所以我正在搜索如何将 return location 值传递给主线程。可以帮我个忙吗?
MDCE 是另一个 header 中的 class,我附上的代码是我第一个代码的一部分。
void MotorPort::StartThread(MDCE* com, QTextBrowser* browser)
{
thread1 = QThread::create(std::bind(&MotorPort::MeasureLocation,this,com,browser));
thread1 -> start();
}
void MotorPort::MeasureLocation(MDCE* com, QTextBrowser* browser)
{
double location;
while(1)
{
location = CurrentLocation(com); \return current position value
browser->setText(QString::number(location));
if (QThread::currentThread()->isInterruptionRequested()) return ;
}
}
void MotorPort::stopMeasure()
{
thread1->requestInterruption();
if (!thread1->wait(3000))
{
thread1->terminate();
thread1->wait();
}
thread1 = nullptr;
}
您应该使用 Qt signal/slot 机制来进行这样的 iter-thread 通知。首先更改您的 MotorPort
class 定义以声明信号 location_changed
...
class MotorPort: public QObject {
Q_OBJECT;
signals:
void location_changed(QString location);
...
}
现在,与其 MotorPort::MeasureLocation
直接调用 QTextBrowser::setText
,不如发出 location_changed
信号...
void MotorPort::MeasureLocation (MDCE *com, QTextBrowser *browser)
{
while (true) {
double location = CurrentLocation(com);
/*
* Emit signal to notify of location update.
*/
emit location_changed(QString::number(location));
if (QThread::currentThread()->isInterruptionRequested())
return ;
}
}
最后,更新 MotorPort::StartThread
以将信号连接到浏览器的 setText
插槽...
void MotorPort::StartThread (MDCE *com, QTextBrowser *browser)
{
connect(this, &MotorPort::location_changed, browser, &QTextBrowser::setText);
thread1 = QThread::create(std::bind(&MotorPort::MeasureLocation, this, com, browser));
thread1->start();
}
我正在通过 QT 制作一些 GUI。 我几乎完成了我的工作,但我很难处理 Qthread。 我的目标是测量电机的位置(它移动)并将其显示在 Qtextbrowser 上,同时在主线程中运行另一个函数。当我编写如下代码时,人们说我不能在线程中直接使用 QTextBrowser(Qwidget),所以我正在搜索如何将 return location 值传递给主线程。可以帮我个忙吗? MDCE 是另一个 header 中的 class,我附上的代码是我第一个代码的一部分。
void MotorPort::StartThread(MDCE* com, QTextBrowser* browser)
{
thread1 = QThread::create(std::bind(&MotorPort::MeasureLocation,this,com,browser));
thread1 -> start();
}
void MotorPort::MeasureLocation(MDCE* com, QTextBrowser* browser)
{
double location;
while(1)
{
location = CurrentLocation(com); \return current position value
browser->setText(QString::number(location));
if (QThread::currentThread()->isInterruptionRequested()) return ;
}
}
void MotorPort::stopMeasure()
{
thread1->requestInterruption();
if (!thread1->wait(3000))
{
thread1->terminate();
thread1->wait();
}
thread1 = nullptr;
}
您应该使用 Qt signal/slot 机制来进行这样的 iter-thread 通知。首先更改您的 MotorPort
class 定义以声明信号 location_changed
...
class MotorPort: public QObject {
Q_OBJECT;
signals:
void location_changed(QString location);
...
}
现在,与其 MotorPort::MeasureLocation
直接调用 QTextBrowser::setText
,不如发出 location_changed
信号...
void MotorPort::MeasureLocation (MDCE *com, QTextBrowser *browser)
{
while (true) {
double location = CurrentLocation(com);
/*
* Emit signal to notify of location update.
*/
emit location_changed(QString::number(location));
if (QThread::currentThread()->isInterruptionRequested())
return ;
}
}
最后,更新 MotorPort::StartThread
以将信号连接到浏览器的 setText
插槽...
void MotorPort::StartThread (MDCE *com, QTextBrowser *browser)
{
connect(this, &MotorPort::location_changed, browser, &QTextBrowser::setText);
thread1 = QThread::create(std::bind(&MotorPort::MeasureLocation, this, com, browser));
thread1->start();
}