QT___信号和槽___操作

信号和槽的使用总结::


slots槽函数作为一个参数来传递:


digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked()));


Button *Calculator::createButton(const QString &text, const char *member)
{
    Button *button = new Button(text);
    connect(button, SIGNAL(clicked()), this, member);
    return button;
}


void Calculator::digitClicked() //经典的操作。
{
    Button *clickedButton = qobject_cast<Button *>(sender());//多个信号绑定到一个slot时的 slot函数处理。  ////怎么区分每个当前的事件从那个信号过来的呢
    int digitValue = clickedButton->text().toInt();
    if (display->text() == "0" && digitValue == 0.0)//已经显示0了,不动作。
        return;


    if (waitingForOperand)
    {
        display->clear();
        waitingForOperand = false;
    }
    display->setText(display->text() + QString::number(digitValue));

}

对多个信号连接一个槽的区分:

 QTimer *tmpTimer = qobject_cast<QTimer *>(sender());
   if(tmpTimer==timer1)  ///这里的timer1,是第一个定时器的指针
   {
       qDebug()<<"time1 timeout!";
   }
   else if(tmpTimer==timer2)//是第二个定时器的指针,
   {
       qDebug()<<"time2 timeout!";
   }
 
 

------------------------------------

信号和槽,其实就是一个回调非阻塞的回调函数,当槽函数和信号在同一个线程中,则为直接连接,默认是Qt::DirectConnection 当不在同一个线程信号会发送到队列中去,也就是说槽与信号是异步的过程,可以在connect后加上Qt::DirectConnection来使他直接连接。

验证信号和槽是回调函数的代码如下: (通常情况下 尽量设置信号和槽的返回值为void  参见网页有:http://topic.csdn.net/u/20120528/21/76ab40b6-d7ca-4b85-a0a9-9b37ae29b9d1.html?7095)

#include "widget.h"
#include <QGridLayout>
#include <QPushButton>
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QGridLayout *grid=new QGridLayout;
 
 
    QPushButton *ptnA=new QPushButton("A");
    connect(ptnA,SIGNAL(clicked()),this,SLOT(testSS()));
     connect(this,SIGNAL(testsig()),this,SLOT(testslot()));
 
 
     grid->addWidget(ptnA);
     setLayout(grid);
}
 
 
Widget::~Widget()
{
    
}
void Widget::testSS()
{
   int ret=emit testsig();
   qDebug()<<ret;
}
int Widget::testslot()
{
    return 1020;
}
#ifndef WIDGET_H
#define WIDGET_H
 
 
#include <QtGui/QWidget>
 
 
class Widget : public QWidget
{
    Q_OBJECT
    
 
 
public:
    Widget(QWidget *parent = 0);
    ~Widget();
signals:
    int testsig();
public slots:
    int testslot();
    void testSS();
};
 
 
#endif // WIDGET_H



你可能感兴趣的:(object,qt,button,Signal)