QT 信号和槽在一个类里面不行吗?

weixin_42022277 2018-08-16 12:12:39
我定义了一个类 信号和槽都在同一个类里面 然后在构造函数里面connect(this, 信号, 槽) 然后用这个类定义了一个全局变量a 开了一个线程 在线程里面 a.fasong() 怎么槽收不到信号呢。
fasong这个函数就一个emit 信号的函数
...全文
668 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
丁劲犇 2018-08-17
  • 打赏
  • 举报
回复
对多线程,connect的最后一个默认参数用 QueuedConnection试试看。
_肆 2018-08-16
  • 打赏
  • 举报
回复
虽然每太看懂你说的意思,但很大可能是线程的原因,你直接在connet的进程里试看你信号有没有触发槽,没懂你说的全局变量a是新申明了个当前类吗还是结构体啥的,这样的话线程里要重connet,你可以帖点关键代码上来
sghcpt 2018-08-16
  • 打赏
  • 举报
回复 1
楼主,QT 信号和槽在一个类里面是可行的。我在我本地测试,使用Qt Creator编译器,使用下面代码:
#ifndef TK_H
#define TK_H
#include<QString>
#include<QThread>
#include<QDebug>

class Student
{
public:
Student(){}
Student(const QString &name, const QString &id)
:m_name(name), m_id(id)
{}

Student(const Student& stu)
{
//故意这样赋值。就是让Qt不能正确复制构造。哈哈!!!
m_name = stu.name();
m_id = stu.m_id;
}

QString name()const { return m_name; }
void name(const QString& name) { m_name = name; }

private:
QString m_name;
QString m_id;
};


class Test : public QObject
{
Q_OBJECT
public:
Test()
{
qRegisterMetaType<Student>("Student");

connect(this, SIGNAL(sendStu(Student)),
this, SLOT(getStu(Student)));
}

private slots:

void getStu(const Student &stu)
{
qDebug()<<QThread::currentThreadId()<<" "<<stu.name();
}

public:
void printStu(const Student& stu)
{
emit sendStu(stu);
}

private:
signals:
void sendStu(const Student& stu);
};

class MyThread : public QThread
{
Q_OBJECT

public:
MyThread(Test * test) : m_test(test)
{}

protected:
void run()
{
qDebug()<<"non main thread "<<QThread::currentThreadId()<<'\n';
Student stu("bbbbbbbb", "111111111111");

//发射信号
m_test->printStu(stu);
}

private:
Test *m_test;
};
#endif // TK_H

#include <QCoreApplication>
#include"tk.h"

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test test;

MyThread mythread(&test);
mythread.start();

return a.exec();
}


都能收到信号,都能正常的输出~~没有出现楼主你上面说的情况呢。。是否楼主在哪里代码处理错了。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧