0

目前正在努力让线程与 Qt C++ 一起使用,并使用最清晰的方法来解决问题。下面是一些启动 3 个线程并计数到 10000 的代码。我现在拥有的是当你按下开始和停止按钮时,计数器会工作(使用 qDebug)。但是我想要做的是将计数器变量链接到 3 个标签,这样当计数器上升时,每个线程的标签也会这样做(但是连接没有运气,因为不确定如何链接类方法(特别是 ui->label- >settext 到 Thread::get_time()))。

目前我被困在最后一部分,因为找不到从 thread.cpp 内部链接到标签的方法,如果有人能提供帮助,那就太好了。正如您可以想象的那样,有点迷路了,不知道从这里去哪里。

对象.h

#ifndef OBJECT_H
#define OBJECT_H

#include <QObject>
#include <QDebug>
#include <QThread>
#include <QApplication>
#include <QMutex>

class Object : public QObject
{
    Q_OBJECT
private:
    int timealive;
public:
    explicit Object(QObject *parent = 0);
    void setup(QThread &thread, QObject &object);
    void set_time(int number);
    int get_time();
    bool Stop;
signals:

public slots:
    void worker();
};

#endif // OBJECT_H

对话框.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

对话框.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked()
{
    ui->label->setText(QString::number(12));
}

void Dialog::on_pushButton_2_clicked()
{

}

void Dialog::on_pushButton_3_clicked()
{

}

void Dialog::on_pushButton_4_clicked()
{

}

void Dialog::on_pushButton_5_clicked()
{

}

void Dialog::on_pushButton_6_clicked()
{

}

主文件

#include "dialog.h"
#include "object.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    QThread thread;
    Object thread_object;

    thread_object.setup(thread,thread_object);

    return a.exec();
}

对象.cpp

#include "object.h"

Object::Object(QObject *parent) :
    QObject(parent)
{
}

void Object::setup(QThread &thread,QObject &object)
{
    object.moveToThread(&thread);

    thread.start();
    connect(&thread,SIGNAL(started()),this,SLOT(worker()));
}

void Object::worker()
{
    for(int i = 0; i < 10000; i++)
    {
        QMutex mutex;
        QMutexLocker locker(&mutex);
        this->set_time(i);
        qDebug() << i;
        if(this->Stop)
        {
            break;
        }
    }
}

void Object::set_time(int number)
{
   timealive = number;
}

int Object::get_time()
{
    return timealive;
}

对话框.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>286</width>
    <height>168</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QWidget" name="layoutWidget">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>40</y>
     <width>261</width>
     <height>25</height>
    </rect>
   </property>
   <layout class="QHBoxLayout" name="horizontalLayout_2">
    <item>
     <widget class="QLabel" name="label_2">
      <property name="text">
       <string>Number</string>
      </property>
     </widget>
    </item>
    <item>
     <spacer name="horizontalSpacer_2">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="sizeHint" stdset="0">
       <size>
        <width>40</width>
        <height>20</height>
       </size>
      </property>
     </spacer>
    </item>
    <item>
     <widget class="QPushButton" name="pushButton_3">
      <property name="text">
       <string>Start</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QPushButton" name="pushButton_4">
      <property name="text">
       <string>Stop</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QWidget" name="layoutWidget_2">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>70</y>
     <width>261</width>
     <height>25</height>
    </rect>
   </property>
   <layout class="QHBoxLayout" name="horizontalLayout_3">
    <item>
     <widget class="QLabel" name="label_3">
      <property name="text">
       <string>Number</string>
      </property>
     </widget>
    </item>
    <item>
     <spacer name="horizontalSpacer_3">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="sizeHint" stdset="0">
       <size>
        <width>40</width>
        <height>20</height>
       </size>
      </property>
     </spacer>
    </item>
    <item>
     <widget class="QPushButton" name="pushButton_5">
      <property name="text">
       <string>Start</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QPushButton" name="pushButton_6">
      <property name="text">
       <string>Stop</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QWidget" name="layoutWidget">
   <property name="geometry">
    <rect>
     <x>9</x>
     <y>9</y>
     <width>261</width>
     <height>25</height>
    </rect>
   </property>
   <layout class="QHBoxLayout" name="horizontalLayout">
    <item>
     <widget class="QLabel" name="label">
      <property name="text">
       <string>Number</string>
      </property>
     </widget>
    </item>
    <item>
     <spacer name="horizontalSpacer">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="sizeHint" stdset="0">
       <size>
        <width>40</width>
        <height>20</height>
       </size>
      </property>
     </spacer>
    </item>
    <item>
     <widget class="QPushButton" name="pushButton">
      <property name="text">
       <string>Start</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QPushButton" name="pushButton_2">
      <property name="text">
       <string>Stop</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

干杯离子

Ps 更改了代码以反映我现在正在使用正确的线程方式。

4

0 回答 0