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;
}
<<返回目录