0

我正在实现一个简单的函数,其中滑块值不断显示在标签和 qDebug() 上。我已经使用信号/插槽更新了标签,但不知何故 qDebug() 线程无法正常工作。我希望看到控制台充满了滑块的值。下面是我的代码: SliderThread.h:

class HorizontalSliderThread : public QThread {
    Q_OBJECT
public:
    HorizontalSliderThread(Ui::MainWindow *ui);//in order to call slider value in HorizontalSliderThread class
    ~HorizontalSliderThread();
public slots:
    void process();
private:
};

SliderThread.cpp

HorizontalSliderThread::HorizontalSliderThread(Ui::MainWindow *ui){
    ui_global = *ui;
}
void HorizontalSliderThread::process(){
    qDebug("Test Thread");
    int value = ui_global.horizontalSlider_windowSize->value();
QObject::connect(ui_global.horizontalSlider_windowSize,SIGNAL(valueChanged(int)),ui_global.label_SliderWindowSize,SLOT(setNum(int)));//update value to label
        qDebug()<<value;    //update value in console

}

mainwindow.h move Ui::MainWindow *ui; 从私人到公共。

主窗口.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QThread* thread = new QThread;
    HorizontalSliderThread* slider = new HorizontalSliderThread(ui);
    slider->moveToThread(thread);
    connect(thread, SIGNAL(started()), slider, SLOT(process()));
    thread->start();
}

当前输出: qDebug() 显示一次滑块的值,标签不断更新。
预期输出: qDebug() 连续显示滑块的值,标签不断更新。

由于在移动滑块时会更新标签,因此此功能的信号/插槽正在工作,这意味着我的线程应该正在工作。不知道我做错了什么。

QThread 实现参考来自: http: //mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

我对此很陌生,尤其是 QThread,所以如果有更好的方法来实现这个功能,请告诉我!

非常感谢。

EDIT1:添加滑块->moveToThread(thread);

4

1 回答 1

0

好吧,您只是将started()信号连接到您的process()函数,因此您的线程启动并调用 process,它尽职尽责地显示您的调试输出并返回。

我怀疑您想在每次值更改时调用您的过程函数,这将需要另一个信号/插槽连接(沿着这些线):

connect(ui_global.horizontalSlider_windowSize, SIGNAL(valueChanged(int)), thread, SLOT(setNum(int)));

此外,您似乎打算在HorizontalSliderThread您创建的单独线程中实际运行,在这种情况下,您需要调用QObject::moveToThread()其中的一些内容:

slider->moveTothread(thread);
于 2013-09-10T04:10:14.313 回答