7.5 QT学习小结(三)

http://blog.chinaunix.net/uid-27717694-id-3792425.html

目录



PART III  (槽与信号、串口)
9. 槽与信号
10. 串口热拔插监听


==========================================================================
9. 槽与信号
槽与信号是QT的一大特色,在QT编程中有广泛的应用,如QPushButton、QComboBox等等控件都会使用到。
常用的信号如下:


//对于QLineEdit ,常用到信号textEdited,即当文本被编辑后,触发该信号
QLineEdit *leoperator;
QObject::connect(leoperator,SIGNAL(textEdited(QString)),this,SLOT(editoperator(QString)));


//对于QPushButton,常用到信号clicked,即当按钮被按下后,触发该信号
QPushButton *pbConnect;
QObject::connect( pbConnect,SIGNAL(clicked()),this,SLOT(connect2port()) );


//对于QComboBox,常用到信号currentIndexChanged,即当选择项改变时,触发该信号
QComboBox *cbChipset;
QObject::connect( cbChipset,SIGNAL(currentIndexChanged(int)),this,SLOT(chipsetchange(int)) );


//对于QTimer,常用到信号timeout,即当计时器时间结束时,触发该信号
QTimer tCount;
QObject::connect(&tCount,SIGNAL(timeout()),this,SLOT(TimeCount()));


诸如此类,在QT控件中还有大量的SIGNAL,应参考QT帮助学习并使用,以上只是简单举例。


对于自定义类,同样可以自定义槽与信号,并使用之。
示例:


a. 自定义类


class winSerial : public QThread
{
    Q_OBJECT


public:
    winSerial();
     ~winSerial();


   //此处省略多余代码
   ....


signals:
    void DT_RDVD( QByteArray temp ); //Data recived
};


b. 在主代码中定义SIGNAL


...
private slots:
    void ReadData(QByteArray temp);
...




c. 实例化winSerial并连接SIGNAL与SLOT


winSerial *m_serial;
QObject::connect( m_serial, SIGNAL(DT_RDVD(QByteArray)), this, SLOT(ReadData(QByteArray)));


d. 触发DT_RDVD
DT_RDVD只可以在自定义类中触发,只需在要触发的地方加入下面代码即可


emit DT_RDVD( QByteArray(data)); // signal generated


按如上方法,即在触发SIGNAL(DT_RDVD)时,将传送一个QByteArray的值做为SLOT(ReadData)的实参,这样极大地方便了数据的传送


<<返回目录
---------------------------------------------------------------------------------------------


10. 串口热拔插监听
关于串口热拔插监听,请更多地参考
《Qt中捕获Windows消息》
《USB转串口突然拔出检测解决方案》
《USB设备监控深入分析》




代码


#include <dbt.h>


bool WndTest::winEvent( MSG * message, long * result )
{
    if( WM_DEVICECHANGE == message->message ){
    }
    else
        goto ev_out;
   
    if( 0x8004 == message->wParam ){
        DEV_BROADCAST_PORT *vol = (DEV_BROADCAST_PORT*)message->lParam;
        QString str = QString::fromWCharArray(vol->dbcp_name); //获取要处理的串口名称


        if( 3 != vol->dbcp_devicetype )
            goto ev_out;
       
        if( m_serial ){
            if( str.size() > 0 ){
                if( str.compare(cbComPort->currentText()) ==0 && m_connected ){ //比较串口名称,判定是否为当前使用的串口
                    closeport(); //关闭串口
                    qDebug()<<"close port:"<<str;
                }
            }
        }
    }
    if( 0x8000 == message->wParam ){
        DEV_BROADCAST_PORT * vol = (DEV_BROADCAST_PORT*)message->lParam; //DEV_BROADCAST_VOLUME
        QString str = QString::fromWCharArray(vol->dbcp_name);
            if( str.size() > 0 ){
                    qDebug()<<"to open port:"<<str; //在DEBUG信息中输出要处理的串口名称
            }
       
    }
ev_out:
    return false;
}
<<返回目录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值