繁体   English   中英

Qt->从Gui-> Thread-> Qtimer设置值

[英]Qt -> Set Value from Gui->Thread->Qtimer

我有一个特殊的相机课,应该尽可能多地打电话给他以获取下一张照片。 gui本身包含一些滑块,可用于更改相机参数和图像输出的设置。

这是我的班级的简单结构:

class CameraWorker : public QObject
{
    Q_OBJECT

public:
    CameraWorker();

signals:
    void imageReady(const QImage &);

private slots:
    void onCamera();
    void setValue(int value);

private:
    Camera camera;
};

class CameraThread : public QThread
{
    Q_OBJECT

public:
    CameraThread();

signals:
    void imageReady(const QImage &);
    void gotValue(int value);

private slots:
    void getImage(const QImage &img);
    void setValue(int value);

private:
    void run();
};

我的主窗口包含:

connect(ui.value, SIGNAL(valueChanged(int)), cameraThread, SLOT(setValue(int)));

我的相机线程包含:

void CameraThread::run()
{
    CameraWorker worker;
    QTimer timer;
    connect(&timer, SIGNAL(timeout()), &worker, SLOT(onCamera()));
    connect(&worker, SIGNAL(imageReady(const QImage &)), this, SLOT(getImage(const QImage &)));
    connect(this, SIGNAL(gotValue(int)), &worker, SLOT(setValue(int)));

    timer.start(0);
    exec();
}

void CameraThread::setValue(int value)
{
    emit gotValue(value);
}

我的相机工作人员包含:

void CameraWorker::setValue(value)
{
    camera.setValue(value);
}

所以问题是,我必须调用Signal-> Slot-> Signal-> Slot-> camera.setValue才能为摄像机获取一个值,但是我有20个值。 有什么更好的方法吗?

您可以将20个值放入按值复制对象中。 这样,您可以通过单个信号/插槽级联快速通过它们。 不要忘记注册您的自定义类型以用于排队连接。

您可能要完全避免信号/插槽开销。 您可以使用QSemaphore(在文档中搜索“ Semaphores Example”)来编写标准的生产者/消费者构造。

您还可以向线程发送一个自定义事件(包含您的数据),该事件应该比使用信号/插槽快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM