14

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

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

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

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

4

1 回答 1

15

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

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() 断开连接。

于 2014-01-05T10:45:52.230 回答