目录PART III (槽与信号、串口)
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转串口突然拔出检测解决方案》
代码
- #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;
- }
---------------------------------------------------------------------------------------------
阅读(8111) | 评论(0) | 转发(2) |