【问题标题】:Difference between QObject::connect vs connect methodsQObject::connect 与连接方法之间的区别
【发布时间】:2014-01-22 19:38:45
【问题描述】:

我是 Qt 的新手。大多数时候 Qt 开发人员需要使用信号和槽进行对象通信。到目前为止,我已经看到了两种连接信号和插槽的方法。

1)QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));

2)connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));

两者之间的确切区别是什么?为什么我们必须在第一个方法中添加 QObject 前缀?

【问题讨论】:

    标签: c++ qt qobject qtcore qt-signals


    【解决方案1】:

    上述两种情况都调用静态版本,其签名如下:

    QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection) [静态]

    当您不在 QObject 子类内部进行连接时,您将需要分别使用作用域变体,因为您将没有适当的对象来调用它。在这里你可以看到一些代表差异的代码。

    没有范围

    class MyClass : public QObject
    {
        Q_OBJECT
        public:
            MyClass(QObject *parent) : QObject(parent) {
                connect(this, SIGNAL(mySignal()), SLOT(mySlot()));
            }
    
        public signals:
            void mySignal();
    
        public slots:
            void mySlot();
    };
    

    作用域

    int main(int argc, char **argv)
    {
        QCoreApplication a(argc, argv);
        MyClass myObject;
        QObject::connect(&myObject, SIGNAL(mySignal()), &myObject, SLOT(mySlot()));
        return a.exec();
    }
    

    请注意,如果您尝试在接收器对象中进行此连接,您甚至可以为了方便而跳过第三个参数(即减少输入),因为非静态 const 版本会根据文档自动处理此问题:

    QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection) const

    这个函数重载了connect()。

    将来自发送者对象的信号连接到该对象的方法。

    等价于connect(sender, signal, this, method, type)。

    您创建的每个连接都会发出一个信号,因此重复的连接会发出两个信号。您可以使用 disconnect() 断开连接。

    【讨论】:

    • 有一个) 缺少: QObject(parent { 应该是:: QObject(parent) {
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2020-08-14
    相关资源
    最近更新 更多