gpt4 book ai didi

c++ - 在 QDialog 中创建线程并向 Qt 中的 QDialog 发出信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:32 25 4
gpt4 key购买 nike

我创建了一个具有主窗口的应用程序,并从该窗口创建了一个 QDialog。这个 QDialog 应该创建一个 RenderThread 来发出从相机接收到的图像,或者在示例中发出文本。当我调试它时,似乎永远不会建立连接,因为在插槽 CameraWindow::debugSomething 中添加断点不会被捕获。怎么了 ?我按照这个例子:http://qt-project.org/doc/qt-4.8/threads-mandelbrot.html但似乎我做错了什么。

qtDEVC::qtDEVC(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
connect (ui.pushButton_startCam, SIGNAL( clicked() ),this,SLOT( startCam() ) );

/**Threading*/
CameraWindow camWindow = new CameraWindow(this);
}


int qtDEVC::startCam()
{
camWindow.show();
camWindow.startCaptureThread();
}

CameraWindow 类:

 CameraWindow::CameraWindow(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);

connect(&thread, SIGNAL(sendText(std::string)),
this, SLOT(debugSomething(std::string)));
}

void CameraWindow::debugSomething(std::string something){
QString somethings(something.c_str());
qDebug()<<somethings;
}

int CameraWindow::startCaptureThread(){

RenderThread *thread = new RenderThread(this, guid, CLEYE_COLOR_RAW, CLEYE_VGA, 50);

thread->StartCapture(); //starts thread in low priority and sets _running to true
}

CameraWindow 标题

 class CameraWindow : public QDialog
{
Q_OBJECT

public:
CameraWindow(QWidget *parent = 0);
~CameraWindow();
Ui::CameraWindow ui;

public slots:
int startCaptureThread();
void debugSomething(QString);

private:
RenderThread thread;
};

渲染线程类

 void RenderThread::run()
{

// image capturing loop
while(_running)
{
qDebug()<<("render while()"); //is printed with qdebug correctly
if (restart)
break;
if (abort)
return;

qDebug("it"); //is also printed with qdebug correctly

emit sendText(text);
}

RenderThread header

class RenderThread : public QThread
{
Q_OBJECT

public:
RenderThread(QObject *parent, GUID cameraGUID, CLEyeCameraColorMode mode, CLEyeCameraResolution resolution, float fps);
RenderThread();
~RenderThread();

bool StartCapture();

signals:

void sendText(QString &text);

protected:
void run();

private:
QMutex mutex;
QWaitCondition condition;
//some more private variables for construction

};

我认为这个创建似乎有些错误:RenderThread *thread = new RenderThread(this);

最佳答案

这个问题首先让人担心的是“RenderThread”这个词。请注意,Qt 只允许在主线程上进行渲染。您可以创建单独的线程来计算图像数据,但无论何时您使用画家和绘制对象,都必须在主线程上进行。但是,如果您只是要捕获图像并将其通过信号和槽传递给主线程,那么应该没问题。

其次,虽然您没有显示所有代码,但我从名为 RenderThread::run() 的函数和 Qt 示例中假设您可能已从此处的 QThread 继承。如果是这种情况,请注意这不是使用 QThread 的方法。相反,您应该让您的类继承自 QObject 并将其移至 QThread。您可以阅读有关如何 use QThread properly here 的信息.

我知道这是您遵循的 Qt 示例,但即使是 Qt 的人也认为这是个坏主意。 Here's an article如何真正使用 QThreads。

考虑到这一点,下面是我将如何为此使用 QThread 的概述:-

class CameraWindow : public QDialog
{
private:
CameraObject* m_pCamObject;
};

class CameraObject : public QObject
{
Q_OBJECT
public:

private slots:
startCaptureThread();

private:
};

int CameraWindow::startCaptureThread()
{
m_pCamObject = new CameraObject;

QThread* pThread = new QThread;

this->moveToThread(pThread); // CameraObject will run on the new thread

connect(pThread, SIGNAL(started()), m_pCamObject, SLOT(startCaptureThread()));
connect(pThread, SIGNAL(finished()), pThread, SLOT(deleteLater()); // clear up when

完成

     pThread->start();
}

请注意,这里是一个 CameraObject,与 CameraWindow 分开。 QThread 只是线程的 Controller ,与 CameraObject 保持清晰的分离。

以这种方式处理线程的另一个原因是您可以将多个 QObject 实例移动到新线程,而不是总是为每个对象创建一个新线程。如果线程数多于 CPU 内核数,则不太可能通过创建另一个线程来获益。

关于c++ - 在 QDialog 中创建线程并向 Qt 中的 QDialog 发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18594528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com