1.用图形界面的signal和slot编辑器添加
2.拖到窗体上的控件如
pushButton的消息处理函数
右键
pushButton选择go to slot
当然也可以不用右键选择go to slot,而是自己写代码添加(就如3)。老外就经常这样干的。
比如拖到窗体上一个按钮叫pushButton
手动声明槽函数
private slots:
void pushButton_click( void );
实现槽函数
void MainWindow::pushButton_click( void )
{
qDebug()<<"dd";
}
在需要的地方连接信号和槽
connect( ui->pushButton, SIGNAL( clicked() ),this, SLOT( pushButton_click() ) );
并且发现手动添加和右键go to slot 也添加槽函数,在按钮按下的时候这两个槽函数都会执行。
3. 对于动态创建的对象,如按钮,则没办法用右键go to slots,那么只好手动添加了。
先声明slot,名字任意
private slots:
void btPress();
再实现slot
void MainWindow::btPress()
{
QMessageBox box;
box.setText("d");
box.exec();
}
在需要的时候创建bt,并connect
void MainWindow::on_pushButton_clicked()
{
QPushButton *bt=new QPushButton(this);
bt->setText("bt");
bt->show();
connect(bt,SIGNAL(clicked()),this,SLOT(btPress()));
}
SIGNAL(clicked())是QPushButton的信号,QPushButton支持的信号有哪些?看help,如下
Additional Inherited Members
- 4 signals inherited from QAbstractButton
- 1 signal inherited from QWidget
- 1 signal inherited from QObject
即
有4个信号继承于QAbstractButton,跟踪进去,可以看到QAbstractButton的信号为以下,4个(QAbstractButton还有两个信号是继承于其父类的)
Signals
void |
clicked ( bool checked = false ) |
void |
pressed () |
void |
released () |
void |
toggled ( bool checked ) |
有1个信号继承于QWidget,跟踪进去,可以看到QWidget的信号为以下,1个
Signals
void |
customContextMenuRequested ( const QPoint & pos ) |
有1个信号继承于QObject,跟踪进去,可以看到QObject的信号为以下,1个
Signals
void |
destroyed ( QObject * obj = 0 ) |
信号在各种事件发生的时候由类的对象发出,信号和槽通过connecte绑定,此时槽函数就被执行
和vc中消息和消息处理函数类似,
消息在事件发生时类的对象自动发出,消息和消息处理函数绑定,此时消息处理函数就被执行
而事件可以是用户交互时的鼠标点击拖动等事件,也可以是其他非交互而产生的事件比如某个请求完成时会产生一个事件,由qt/mfc框架定义。
对于connect中的SLOT(btPress())
btPress()是自定义的一个函数。并用private slots修饰(不用slots也可)
有些类本身就已经有了一些槽函数,他们或者是自己的,或者是继承于基类的,比如按钮
Public Slots
- 5 public slots inherited from QAbstractButton
- 19 public slots inherited from QWidget
- 1 public slot inherited from QObject
信号和槽编辑器里面可以找得到槽函数
问题是,
还不知道类已有的槽函数怎么去重写--如果是虚函数的话,要不要重写?
类已有的槽函数理论上应该是已经和某个信号关联了,而不用手动去connecte也不用在信号和槽编辑器去关联---否则这些槽函数和类已有的普通成员函数或者自定义的成员函数还有什么区别?普通成员函数也可以在connecte里写到slot里面...
4.对于菜单或者工具栏上的按钮的信号和槽的添加如下
右键选中的那项选择go to slot,然后选择triggered(),默认就是
5. 对于鼠标事件,键盘事件,定时器事件的捕获,可以用以下方式
先声明slot
,名字为系统预定,不要改变
private slots:
void mouseMoveEvent(QMouseEvent *);
void keyPressEvent(QKeyEvent *);
void timerEvent(QTimerEvent *);
再实现slot
void MainWindow::mouseMoveEvent(QMouseEvent *m)
{
int x = m->pos().x();
int y = m->pos().y();
//获取鼠标现在的位置坐标
ui->pushButton->setText(tr("mouse coordinator is (%1,%2)").arg(x).arg(y));
}
void MainWindow::keyPressEvent(QKeyEvent *k)
{
if(k->key() == Qt::Key_A) //判断是否是A键按下
{
;
}
}
void MainWindow::timerEvent(QTimerEvent *t) //定时器事件
{
if(t->timerId()==id1){
QMessageBox::warning(this,"title",tr("timer%1").arg(t->timerId()));
//killTimer(t->timerId());
}
else if(t->timerId()==id2){
QMessageBox::warning(this,"title",tr("timer%1").arg(t->timerId()));
//killTimer(t->timerId());
}
else {
QMessageBox::warning(this,"title",tr("timer%1").arg(t->timerId()));
//killTimer(t->timerId());
}
}
http://www.yafeilinux.com/?p=43