zoukankan      html  css  js  c++  java
  • QT信号和槽

    信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性。要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C++ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码。 信号和槽能携带任意数量和任意类型的参数。我们可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。)甚至于将一个信号与另外一个信号相连接,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。

    信号(Signals)

    信号只需要在头文件中做声明,不需要在cpp中实现。放在QT自定义关键字signals下,在此之前一定要加上Q_OBJECT宏!

    在编程中,一般使用的是控件内部定义好的信号。如:QTreeView类下的 Signals:

    1 Q_SIGNALS:
    2     void pressed(const QModelIndex &index);
    3     void clicked(const QModelIndex &index);
    4     void doubleClicked(const QModelIndex &index);
    5 
    6     void activated(const QModelIndex &index);
    7     void entered(const QModelIndex &index);
    8     void viewportEntered();

    也可以自定义信号,并通过emit在代码中发射信号。

    emit setvisiable(id,item->checkState());

    槽(Slots)

    public Q_SLOTS:
        virtual void reset();
        virtual void setRootIndex(const QModelIndex &index);
        virtual void doItemsLayout();
        virtual void selectAll();
        void edit(const QModelIndex &index);
        void clearSelection();
        void setCurrentIndex(const QModelIndex &index);
        void scrollToTop();
        void scrollToBottom();
        void update(const QModelIndex &index);

      槽和普通的C++成员函数几乎是一样的(可以是虚函数,可以被重载,可以是public slots、protected slots、private slots,可以被其他C++成员函数直接调用;唯一不同的是:槽还可以和信号连接在一起,在这种情况下,信号被发射时,会自动调用这个槽。槽不需要信号传过来的参数时,可以不要参数;但槽一旦要参数,其参数个数,类型,顺序必须要和对应的信号保持一致。另外,槽的参数不能有缺省值。

    关联信号和槽(connect)

    可以使用QObject类的静态成员函数connect来建立信号的槽的关联

    static bool connect(const QObject *sender, const QMetaMethod &signal,
                            const QObject *receiver, const QMetaMethod &method,
                            Qt::ConnectionType type = Qt::AutoConnection);

    具体的调用为:connect(scenetree,SIGNAL(setvisiable(int,Qt::CheckState)),this,SLOT(setvisiable(int,Qt::CheckState)));

    其中sender和receiver为QObject类对象的指针; SIGNAL宏和SLOT宏将信号的槽转换成字符串。

    注:在connect函数中信号函数和槽函数若有参数,只能写出参数类型,而不能也将变量名写出;否则,连接会失败!

    断开信号和槽(disconnect)

    当信号和槽没有必要继续保持连接时,可以通过调用disconnect来断开它们。

    bool QObject::disconnect (const QObject * sender, const char * signal,  const Object * receiver, const char * slot) [static]

    有三种情况必须使用 disconnect() 函数:

    (1)断开与某个对象相关联的任何对象。

    disconnect(sender, 0, 0, 0) ;
    
    //或者
    
    sender->disconnect();

    (2)断开与某个特定信号的任何关联。

    disconnect(sender, SIGNAL(signal()), 0, 0);
    
    //或者
    
    sender->disconnect(SIGNAL(signal()));

    (3)断开两个对象之间的关联。

    1 disconnect(sender, 0, receiver, 0);
    2 
    3 //或者
    4 
    5 sender->disconnect(receiver);

    来自:http://www.cnblogs.com/kekec/archive/2011/07/20/2112054.html

  • 相关阅读:
    模板库
    LCT小结
    BZOJ1502: [NOI2005]月下柠檬树
    技术资料分享
    ORM介紹及ORM優點、缺點
    依賴注入入門——Unity(二)
    面向切面編程入門(一)
    依賴注入入門——Unity(一)
    WCF、.Net Remoting、Web Service概念及区别
    深入设计模式(四)——建造者模式
  • 原文地址:https://www.cnblogs.com/huipengkankan/p/2519747.html
Copyright © 2011-2022 走看看