no such signal-QT多线程信号槽没有响应

问题描述

QT多线程信号槽没有响应

程序逻辑很简单,就是让一个独立线程发送一个信号,UI线程的槽响应,但是运行报错居然是找不到信号
No such signal ,但是编译可以通过,moc文件也有这个信号。大侠们指点一下子,谢谢

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
connect (&thread,SIGNAL(sendStr(QString)),this,SLOT(MsgStr(QString)),Qt::DirectConnection);
//
}

Dialog::~Dialog()
{
delete ui;
}

// 启动线程按钮
void Dialog::on_startButton_clicked()
{
thread.start();
ui->startButton->setEnabled(false);
ui->stopButton->setEnabled(true);
}

// 终止线程按钮
void Dialog::on_stopButton_clicked()
{
qDebug ()<<"Button";
if (thread.isRunning()) {
thread.stop();
ui->startButton->setEnabled(true);
ui->stopButton->setEnabled(false);
}
}

void Dialog::MsgStr(QString &str)
{
qDebug ()<<str;
}

/////////////////////////////////////
#ifndef DIALOG_H
#define DIALOG_H

#include
#include "mythread.h"
#include

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
Q_OBJECT

public:
explicit Dialog(QWidget *parent = 0);
~Dialog();

private slots:
void on_startButton_clicked();
void on_stopButton_clicked();
void MsgStr(QString &str);
private:
Ui::Dialog *ui;
CanThread thread;

};

#endif // DIALOG_H

////////////////////////////////////////////////////////
#include "mythread.h"
#include

CanThread::CanThread(QObject *parent) :
QThread(parent)
{
stopped = false;
}

void CanThread::run()
{
qreal i = 0;
exec ();
while (!stopped) {
// qDebug() << QString("in CanThread: %1").arg(i);
msleep(1000);
QString str = QString("in CanThread: %1").arg(i);
emit sendStr(str);
// exportFun();
i++;
}
stopped = false;
}

void CanThread::exportFun()
{
msleep(1000);
}

void CanThread::stop()
{
stopped = true;
qDebug ()<<"start 1";
// qDebug ()<<"start 2";
}
////////////////////////////////////////
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include

class CanThread : public QThread
{
Q_OBJECT
public:
explicit CanThread(QObject *parent = 0);
void stop();
void exportFun();
protected:
void run();

private:
volatile bool stopped;

signals:
void sendStr(QString &);
public slots:

};

#endif // MYTHREAD_H

解决方案

求求各位大神了,拜托看一眼,信号槽用法应该没有错误,实在没办法,求求大家了

解决方案二:

问题已经解决,问题原因
可能是由于传递的值不可以是局部变量
解决办法信号槽 定义时,不能使用 QString &str 的引用,但是可以这样用const QString &str 或者QString str

解决方案三:

1.一个主界面(主线程),一个次线程,次线程通过信号向主线程传递递增变量,主线程将它显示出来
mythread.h

#include
#include
class Mythread : public QThread
{
Q_OBJECT
public:
Mythread();
protected:
void run();
private:......
答案就在这里:QT 多线程信号与槽(一)
----------------------

时间: 2024-08-31 13:30:03

no such signal-QT多线程信号槽没有响应的相关文章

多线程中的信号/槽

作者: 柴树杉[翻译] (chaishushan@gmail.com) 日期: 2008-01-05 于武汉 注解: 该文档根据Threading, Signals/Slots翻译,依照创作公用约定发布. 开始 在许多应用中都会遇到非常耗时的运算,在进行该类型运算时常常会影响程序正常的消息处理. 为了处理上述问题,我们可以将耗时的运算从GUI线程中移出来,单独放到一个work线程中. 这样的话,GUI则可以保持时刻响应. 下面的例子中,我们将演示如何运用多线程.在一个work线程中将完成绘制五角

Qt学习之路(4):初探信号槽

看过了简单的Hello, world! 之后,下面来看看Qt最引以为豪的信号槽机制! 所谓信号槽,简单来说,就像是插销一样:一个插头和一个插座.怎么说呢?当某种事件发生之后,比如,点击了一下鼠标,或者按了某个按键,这时,这个组件就会发出一个信号.就像是广播一样,如果有了事件,它就漫天发声.这时,如果有一个槽,正好对应上这个信号,那么,这个槽的函数就会执行,也就是回调.就像广播发出了,如果你感兴趣,那么你就会对这个广播有反应.干巴巴的解释很无力,还是看代码: #include <QtGui/QAp

Qt学习之路(9):深入了解信号槽

槽函数和普通的C++成员函数没有很大的区别.它们也可以使virtual的:可以被重写:可以使public.protected或者 private的:可以由其它的C++函数调用:参数可以是任何类型的.如果要说区别,那就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用. connect()语句的原型类似于: connect(sender, SIGNAL(signal), receiver, SLOT(slot)); 这里,sender和receiver都是QObject类型的,si

Qt 自定义信号与槽

注 对象与槽理解 //第一个参数lineEdit是激发事件对象,信号中的方法必须在对象中存在,并在对象类头文件signals下定义, //第二个参数信号, //第三个参数this是槽方法所属类的对象,且必须在对象类的头文件的slots下定义 //第四个参数槽方法类,槽 方法 connect(lineEdit,SIGNAL(textChanged(QString)),this,SLOT(showArea())); 使用自定义的信号和槽,需要注意以下几点: 1.类的声明和实现分别放在.h和.cpp文

信号槽库:sigslot.h和sigc++使用

用qt的知道,qt有方便简单的信号槽机制,但需要专门的qt工具处理. 如果想直接使信号槽就可以使用sigslot库,或者sigc++库,或者boost中的signals,这里介绍sigslot和sigc++库. sigslot.h:只有一个头文件,使用简单方便. sigc++:包含文件多,但功能更强大. sigslot库 官方地址 http://sigslot.sourceforge.net/ 在vs2013中使用 包含头文件 #include "sigslot.h" 1 1 改动:

qt-关于QT多线程下的connect问题

问题描述 关于QT多线程下的connect问题 我用QT生成的ui界面中生添加了按钮A,我想在点击按钮A后,用自定义的线程去执行 A的槽函数,或者是用自定义的线程去监听A的点击事件,然后再去执行A的槽函数, 新手,求解,谢谢! 解决方案 1.定义按钮响应槽函数,并connect到该槽函数: 2.创建一个线程: 3.在槽函数中向线程推送要执行的任务,然后槽函数返回. 解决方案二: vector tasks; void ThreadFunc() { while(1) { for( int i=0;

PyQt5 笔记(05):信号/槽

  PyQt 的很多类都内置了信号和槽.下图是 Qt 官方文档对 QThread 类中包含的信号/槽的描述:       一.信号/槽 都是内置的 请看一个最简单的程序: 按钮点击后,窗口关闭                 代码: class Test(QDialog): def __init__(self, parent=None): super().__init__(parent) btn = QPushButton('关闭', self) btn.clicked.connect(self

c++-qt多线程如何调用多核

问题描述 qt多线程如何调用多核 我的程序要处理大量的数据,想开辟多个线程,但是当跑起来的时候,其实它们只是在轮流着执行的,并没有在多核上运行,改进程的cpu占用量一直是50%,请问我用什么办法可以是多个线程跑在多个cpu上,使cpu占用量到100%呢 解决方案 多个线程就是可以利用多个处理器的.检查下你是不是有多余的代码锁定和同步. 解决方案二: 不知道LZ是不是由于别的操作限制了速度,如果速度是从磁盘读的,可能跟磁盘性能有关系,要与磁盘同步数据,io太多 如果是数据库,虽然你每次只插一条数据

QGraphicsItem如何使用信号/槽

简述 对于 QGraphicsItem 来说,信号/槽和属性机制不是它的一部分,因为它不继承自 QObject.这是一个出于性能考虑的设计决策,允许比较大的场景以及快速的交互. 特殊情况下,如果真的需要使用信号/槽,可以使用 QObject 的信号/槽和属性机制来扩展 QGraphicsItem. 简述 继承自 QObject 和 QGraphicsItem 继承自 QGraphicsObject 性能差异 继承自 QObject 和 QGraphicsItem 这种方式属于多继承,也是最容易想