- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我创建了一个具有主窗口的应用程序,并从该窗口创建了一个 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/
在我的主应用程序中,我打开了一个 QDialog,我想从这个 QDialog 打开/显示另一个。它没有显示第二个带有焦点的对话框,而是出现在我的主应用程序后面并被阻止/禁用,我无法使用它。每个表单都在
在我的 Qt 应用程序中,我面临以下情况:当引发特定事件时,我会显示一个无模式的 QDialog,它要求用户进行确认。使用 QMainWindow 中的 show() 函数显示对话框。任何时候引发事件
我创建了一个具有主窗口的应用程序,并从该窗口创建了一个 QDialog。这个 QDialog 应该创建一个 RenderThread 来发出从相机接收到的图像,或者在示例中发出文本。当我调试它时,似乎
在 Qt 中,我每次单击某个项目时都会打开 QDialog 窗口我用 new 来做,我想确保我只为每个项目打开一个 QDialog 实例我正在点击: void foo::treeWidget_item
基于Qt 4.8的应用程序-QDialog出现问题,最小化按钮 Windows和Gnome(Linux) 出现模式对话框,并在右上角显示关闭按钮,并且最小化按钮为不存在。 最小化选项在每个对话框中以灰
我想做一个QDialog的背景透明的,所以我可以透过 window 看到。我问是因为我想使用半透明背景图像来创建“圆角窗口”错觉。使用 setOpacity对我来说不是一个选择,因为我希望所有小部件保
我一直在尝试关闭从主窗口分支出来的 QDialog 窗口。到目前为止,以下内容对我不起作用: self.close() QDialog.close() 我尝试了其他命令,例如 exit 和 exec_
我正在使用 Qt Creator 开发 Qt 5.5。我有一个名为 settingsWindow 的大类,顾名思义,它负责各种设置。这些设置然后用于启动一些 QDialogs,这些 QDialogs
我正在使用 qt-creator 构建一个小型 QT 应用程序。 我有一个主窗口,其中有一些控件,例如“新联系人”按钮。按下按钮,会显示一个 QDialog,它包含 3 行编辑:姓名、手机和电子邮件。
我有一个派生自 QDialog 的类。我有一个静态实例,我使用 exec 多次显示它。如果用户手动调整对话框的大小,我希望以后调用 exec 以以前的大小启动它。 我看过一些使用 QSettings
当使用带有动态内容的QDialog时,窗口的大小可能会变大以更好地适应内容。 但是,在我的例子中,我还希望它在内容变小时自动缩小它的大小(在我的例子中,一个表格可能会因所做的选择而有所不同)。 我怎样
如何简单地设置 QDialog 的背景?我可以轻松设置背景颜色,但是当我尝试使用图像时,我的背景变黑了。我试图使用:QPallete 和 QBrush,StyleSheets :(。 最佳答案 你可以
我有一个由中央应用程序创建和管理的对话。对话在运行时生成小部件,并具有将对话恢复为其默认排列的成员函数,即顶部的按钮框和底部的单个小部件。隐藏对话时调用此恢复函数。我可以从对话中取出额外的小部件,但我
我有一个主窗口,当我按下一个按钮时,它会创建一个 QDialog(它的名字是 qds)。当我关闭主窗口时,我希望 QDialog 也关闭。但是,当我关闭主窗口时,QDialog 仍然打开并且应用程序仍
我是 Qt 的新手,在创建新对话框时遇到了问题。这是它的类: class MyDialog : public QDialog, public Ui::ConnectToSource { public:
我有一个像这样打开的 QDialog: void MyModule::openDialog() { this->dialog->open(); printf("Hello World"
如果我将 QDialog 结果值作为 QDialog::Accepted,那么该值存储在哪里?而且,知道这样的值(value)有什么好处? 谢谢。 最佳答案 您可以通过调用 QDialog 的 res
如果我创建我的 QDialog 并使用 exec() 以模态显示它,一切正常,但我不需要这个非模态! 使用 show() 对话框是空的! ProgramLoading *programLoading
我想知道如何在鼠标悬停时显示 QDialog。我知道如何设置上下文菜单,但我希望在鼠标悬停时显示 QDialog。 这就是我正在做的(显然不起作用) void mouseMoveEvent( QMou
我有一个主窗口,它可以从 MySQL 进行一些搜索,例如。如果我输入“abc”,它会搜索所有包含“abc”的邮件,然后它将所有结果插入 QTableWidget 并显示它,如果我双击其中任何一个,它将
我是一名优秀的程序员,十分优秀!