小编Lou*_*ltz的帖子

delete和deleteLater如何处理Qt中的信号和插槽?

有一个类QNetworkReply的对象.有一个插槽(在某些其他对象中)连接到其finished()信号.信号是同步的(默认值).只有一个主题.

在某些时刻,我想摆脱两个对象.没有更多的信号或任何东西.我希望他们走了.好吧,我想,我会用的

delete obj1; delete obj2;
Run Code Online (Sandbox Code Playgroud)

但我真的可以吗?~QObject的规格说:

等待传递挂起事件时删除QObject可能会导致崩溃.

什么是"待定事件"?这是否意味着当我打电话给我时delete,已经有一些"未决事件"要发送,并且它们可能会导致崩溃,我无法确定是否有任何?

所以我要说我打电话:

obj1->deleteLater(); obj2->deleteLater();
Run Code Online (Sandbox Code Playgroud)

为了安全起见.

但是,我真的很安全吗?该deleteLater补充说,将在主回路控制时到达那里进行处理的事件.是否有一些待处理事件(信号)obj1obj2已经存在,等待在处理deleteLater 之前在主循环中处理?那将是非常不幸的.我不想编写"有点删除"状态的代码检查,并忽略所有插槽中的传入信号.

qt slot qt-signals

73
推荐指数
3
解决办法
5万
查看次数

如何在Qt中发出跨线程信号?

Qt文档指出信号和槽可以是direct,queuedauto.

它还声明,如果拥有插槽的对象'生命'在与拥有信号的对象不同的线程中,则发出此类信号就像发布消息一样 - 信号发出将立即返回,并且将在目标线程的事件循环中调用slot方法.

不幸的是,文档没有说明"生命"代表的是没有例子可用.我试过以下代码:

main.h:

class CThread1 : public QThread
{
Q_OBJECT
public:
    void run( void )
    {
        msleep( 200 );
        std::cout << "thread 1 started" << std::endl;
        MySignal();
        exec();
    }
signals:
    void MySignal( void );
};

class CThread2 : public QThread
{
Q_OBJECT
public:
    void run( void )
    {
        std::cout << "thread 2 started" << std::endl;
        exec();
    }
public slots:
    void MySlot( void )
    {
        std::cout << "slot called" << std::endl;
    } …
Run Code Online (Sandbox Code Playgroud)

c++ qt signals-slots qt-signals

58
推荐指数
2
解决办法
8万
查看次数

Qt信号(QueuedConnection和DirectConnection)

我在使用Qt信号时遇到问题.

我不明白怎么做DirectConnectionQueuedConnection有效?

如果有人会解释何时使用其中的哪一个(示例代码将被赞赏),我将感激不尽.

c++ qt qthread qt-signals

44
推荐指数
2
解决办法
6万
查看次数

私人/公共qt信号

Qt信号可以是公共的还是私人的?我可以创建只在课堂内看到的内部信号吗?

更新:我有一个带有一些内部信号的课程.如何让这些信号对其他类不可见(封装和信息隐藏)?

qt qt-signals

34
推荐指数
6
解决办法
3万
查看次数

在接口类中声明抽象信号

当实现类已经从QObject/QWidget中获取时,如何在抽象类/接口中声明Qt信号?

class IEmitSomething
{
   public:
     // this should be the signal known to others
     virtual void someThingHappened() = 0;
}

class ImplementEmitterOfSomething : public QWidget, public IEmitSomething
{
     // signal implementation should be generated here
     signals: void someThingHappended();
}
Run Code Online (Sandbox Code Playgroud)

c++ qt qt-signals

32
推荐指数
3
解决办法
2万
查看次数

何时使用信号和插槽以及何时不使用

我们正在使用提供信号和插槽的Qt,我觉得非常方便.然而,强大的力量带来了巨大的责任,我认为很容易滥用这个功能.

是否有信号槽使用的最佳实践?我很难以这种方式找到一些通用指南.一些问题(我有明确的意见,但并非所有团队成员都同意):

  • 使用信号报告错误是否可以?
  • 可以假设信号将被处理吗?
  • 信号可用于启动行动吗?例如,signal displayInfoScreen()必须由显示信息屏幕的插槽处理.

关于何时应该/不应该使用信号的任何其他意见都是非常受欢迎的!

c++ qt signals-slots qt-signals

24
推荐指数
4
解决办法
3157
查看次数

如何在不派生QObject的情况下使用SIGNAL和SLOT?

或其他方式来表达我的问题(虽然它没有解决我的问题):'QObject :: QObject'无法访问类'QObject'中声明的私有成员

我的课程中需要SIGNALs和SLOTS功能,但我认为不可能从中衍生出来QObject

class MyClass
{
signals:
   importantSignal();
public slots:
   importantSlot();
};
Run Code Online (Sandbox Code Playgroud)

问题似乎是我需要派生QObject来使用信号和插槽......但我需要默认的构造函数MyClass.但由于以下特性,我无法构造它们QObject: No Copy Constructor或Assignment Operator.

我试了很多......

所以我的上课看起来像这样:

#include <QObject>
class MyClass: public QObject
{
    Q_OBJECT
public:
    explicit MyClass(QObject *parent = 0); //autogenerated by qtcreator for QObject derived class
    MyClass(const MyClass * other);

signals:
    importantSignal();
public slots:
    importantSlot();
};
Run Code Online (Sandbox Code Playgroud)

我需要默认的构造函数MyClass.

那么有没有可能避免"'QObject :: QObject'无法访问类'QObject'中声明的私有成员"错误?

或者作为替代方案是否有可能没有使用信号和插槽QObject

我很高兴有任何建议.

c++ qt qobject slot qt-signals

16
推荐指数
2
解决办法
2万
查看次数

qt信号未定义的参考错误

我有一个类服务器,我已经创建了一个加入的信号(QString名称).我在一个名为join(QString name)的函数中调用它,但是我收到了错误

Server.o:在函数Server::join(QString)': Server.cpp:(.text+0x48): undefined reference to Server :: joined(QString)'collect2:ld返回1退出状态

这是我的头文件的样子:

#ifndef SERVER_H
#define SERVER_H

#include <QString>
#include <mqueue.h>
#include <QVector>
#include <QStringList>
#include "../src/messages.h"

class Server
{
public:
    Server();
    void start();
private:
    void join(QString name);
    char buf[MSG_SIZE], msgSend[MSG_SIZE];
    QVector<mqd_t> mq_external;
    QVector<QString> users;
    mqd_t mq_central;
    struct mq_attr attr;


signals:
    void joined(QString name);

};

#endif // SERVER_H
Run Code Online (Sandbox Code Playgroud)

这是我的cpp文件:

#include "Server.h"

using namespace std;

Server::Server()
{
}

void Server::start(){

    attr.mq_maxmsg = 100;
    attr.mq_msgsize = MSG_SIZE;
    attr.mq_flags = 0;

    mq_unlink(CENTRALBOX);
    mq_central = …
Run Code Online (Sandbox Code Playgroud)

c++ qt signals-slots qt-signals

16
推荐指数
2
解决办法
2万
查看次数

QSignalMapper如何工作?

我在这里发布后:将信号和插槽关联到qcheckbox动态创建我需要关联:

clicked()单击某个qCheckBox功能时的信号cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)

要做到这一点,我必须使用QSignalMapper,经过两个小时试图了解它是如何工作的,我不能有一个好的结果,这是我做的代码,这显然是错误的:

 QSignalMapper *m_sigmapper = new QSignalMapper(this);
 QObject::connect(pCheckBox, SIGNAL(mapped(QTableWidget*,int, QCheckBox*)), pCheckBox, SIGNAL(clicked()));
 QObject::connect(this, SIGNAL(clicked()), this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));

 m_sigmapper->setMapping(pCheckBox, (monTab,ligne, pCheckBox));
 QObject::connect(m_sigmapper, SIGNAL(clicked()),this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));
Run Code Online (Sandbox Code Playgroud)

你能解释一下,怎么样QSignalMapper?我真的不明白要联系到什么:(

c++ qt slot qt-signals qsignalmapper

11
推荐指数
2
解决办法
1万
查看次数

使用具有多重继承的Qt信号和插槽

我有一个class(MyClass)从Qt内置对象(QGraphicsTextItem)继承其大部分功能.QGraphicsTextItem从中间接继承QObject.MyClass还实现了一个接口MyInterface.

class MyClass : public QGraphicsTextItem, public MyInterface
Run Code Online (Sandbox Code Playgroud)

我需要能够使用connectdisconnect开启MyInterface*.但现在看来,connectdisconnect只在工作QObject*实例.由于Qt不支持从QObject的派生类多继承,我不能得到MyInterfaceQObject.(无论如何,这对于界面也没有多大意义.)

有一个问题的讨论在网上,但IMO所提出的解决方案是在通常情况下(访问通过其接口的对象)相当无用的,因为你无法连接的信号和槽MyInterface*,但必须将它转换为派生类型.由于MyClass是许多MyInterface衍生类中的一个,这将需要"代码 - 臭"如果 - 这个 - 演绎 - 否则 - 如果 - 那个 - 演绎到那个语句并且破坏了接口的目的.

这个限制有一个很好的解决方案吗?

更新:我注意到,如果我dynamic_castMyInterface*QObject*(因为我知道所有MyInterface的派生类也最终从继承QObject,它似乎工作即:

MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance), …
Run Code Online (Sandbox Code Playgroud)

c++ qt multiple-inheritance qt-signals

9
推荐指数
2
解决办法
7191
查看次数