以 两个控件label和button为例,当单击button时,在label上显示“hello world”。
项目建好后,控件安放好。
1. 自己定义槽函数和映射
1)在头文件mainwindow.h中类MainWindow的定义中声明槽函数:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pubshButton_clicked();
....
};
2) 定义槽函数体在mainwindow.cpp文件中:
void MainWindow::on_pushButton_clicked()
{
ui->label->setText("Hello world");
}
3)建立映射,在类MainWindow的构造函数中添加如下语句,以便将信号和槽函数进行连接:(我在实验时,并没有进行该步但是能实现功能,加上这步骤后,编译出错)
MianWindow::MainWindow(QWidget *parent): QMainWindow(parent),ui(new ui::MainWindow)
{
connect(ui->pushbutton,SIGNAL(clicked()),this, SLOT(on_pushButton_clicked());
ui->setupUi(tis);
}
2. 右击"OK"按钮,选择“转到槽”选项,选择信号“clicked()”, 单击”确定“按钮。系统自动生成槽函数的声明和定义,并建立内部映射(在构造函数中看不到映射代码?),在槽函数体内编写功能即可。
3. 右击界面选择”改变信号/槽“选项, 单机”+“添加新的槽函数, 如图所示:单击”确定“完成槽函数的添加。在窗体编辑区的下方有信号和槽的映射窗口,单击左上角的加号,添加映射,编辑映射关系。重复1.中的1)和2)完成槽函数的声明及定义。
图2 改变信号/槽
图3 信号和草编辑器-----------在这里进行信号和槽函数的关联, 在”发送者“ ”信号” “接受者” “ 槽” 中可以选择 关联的东西。
附:信号和槽的映射(转)
http://mobile.51cto.com/symbian-267807_1.htm
四、信号与槽的关联
通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:
- bool QObject::connect ( const QObject * sender, const char * signal,
- const QObject * receiver, const char * member ) [static]
这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在connect调用中接收者参数可以省略。
例如,下面定义了两个对象:标签对象label和滚动条对象scroll,并将valueChanged()信号与标签对象的setNum()相关联,另外信号还携带了一个整形参数,这样标签总是显示滚动条所处位置的值。
- QLabel *label = new QLabel;
- QScrollBar *scroll = new QScrollBar;
- QObject::connect( scroll, SIGNAL(valueChanged(int)),
- label, SLOT(setNum(int)) );
一个信号甚至能够与另一个信号相关联,看下面的例子:
- class MyWidget : public QWidget
- {
- public:
- MyWidget();
- ...
- signals:
- void aSignal();
- ...
- private:
- ...
- QPushButton *aButton;
- };
- MyWidget::MyWidget()
- {
- aButton = new QPushButton( this );
- connect( aButton, SIGNAL(clicked()), SIGNAL(aSignal()) );
- }
在上面的构造函数中,MyWidget创建了一个私有的按钮aButton,按钮的单击事件产生的信号clicked()与另外一个信号aSignal ()进行了关联。这样一来,当信号clicked()被发射时,信号aSignal()也接着被发射。当然,你也可以直接将单击事件与某个私有的槽函数相关联,然后在槽中发射aSignal()信号,这样的话似乎有点多余。
当信号与槽没有必要继续保持关联时,我们可以使用disconnect函数来断开连接。其定义如下:
- bool QObject::disconnect ( const QObject * sender, const char * signal,
- const Object * receiver, const char * member ) [static]
这个函数断开发射者中的信号与接收者中的槽函数之间的关联。
有三种情况必须使用disconnect()函数:
断开与某个对象相关联的任何对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或者多个信号,这些信号与另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就可以利用这个方法,非常之简洁。
- disconnect( myObject, 0, 0, 0 )
或者
- myObject->disconnect()
断开与某个特定信号的任何关联。
- disconnect( myObject, SIGNAL(mySignal()), 0, 0 )
或者
- myObject->disconnect( SIGNAL(mySignal()) )
断开两个对象之间的关联。
- disconnect( myObject, 0, myReceiver, 0 )
或者
- myObject->disconnect( myReceiver )
在disconnect函数中0可以用作一个通配符,分别表示任何信号、任何接收对象、接收对象中的任何槽函数。但是发射者sender不能为0,其它三个参数的值可以等于0。