我有一个特殊的相机类,应尽可能经常调用以获得下一张照片。 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);
}
所以问题是,我必须打电话给信号 - >插槽 - >信号 - >插槽 - > camera.setValue为摄像机获取一个值,但我有20个值。有没有更好的方法呢?
答案 0 :(得分:1)
您可以将20个值放入按值复制的对象中。这样,您可以使用单个信号/插槽级联快速传递它们。不要忘记在排队连接中注册自定义类型以供使用。
您可能希望完全避免信号/插槽开销。您可以使用QSemaphore编写标准的生产者/消费者构造(在文档中搜索“Semaphores Example”)。
您也可以向线程发送自定义事件(包含您的数据),这应该比使用信号/插槽更快。