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() はスライダーの値を 1 回表示し、ラベルは常に更新されます。
期待される出力: qDebug() はスライダーの値を継続的に表示し、ラベルは常に更新されます。

スライダーが移動するとラベルが更新されるため、この関数のシグナル/スロットが機能しているため、スレッドが機能しているはずです。私が間違っていることを知りません。

QThread の実装は、http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/ からの参照です

私はこれ、特に QThread にかなり慣れていないので、この機能を実装するより良い方法があれば教えてください!

どうもありがとう。

EDIT1: スライダーを追加->moveToThread(スレッド);

4

1 に答える 1

0

started()シグナルを関数に接続しただけ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 に答える