自动关联
第一种自然是手动关联了,只要调用connect函数就能实现自动关联。
这里重点讲第二种,自动关联:
为了实现槽函数自动进行关联,对于Qt窗口部件已经提供的信号,可按照以下规范命名:void on_<窗口部件名称>_<信号名称>_(<信号参数>);
自动关联只适用于Qt部件已经定义好的信号,如果是程序员自己定义的信号则必须手动关联。还有,对于是在Qt设计器往界面添加的部件,那么就可以直接写上面函数格式,以实现自动关联。但是对于不是在Qt设计器往界面添加的部件,我们就要在调用setUi()函数前定义该部件,而且还要使用setObjectName()函数指定部件的对象名,重点来了,setObjectName()函数设置的对象名必须与窗口部件名称一样,即,全部名字一样,那才能够实现自动关联。
例如:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
//自动关联
button=new QPushButton(this);
button->move(50,100);
button->setText(tr("二重点击"));
button->setObjectName(tr("button"));//对象名尤其重要,一定要相同
ui->setupUi(this);
//手动关联connect(ui->showChildButton,SIGNAL(clicked()),this,SLOT(showChildDialog()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_button_clicked()
{
QDialog *dialog=new QDialog(this);
dialog->show();
}
断开信号和槽(disconnect)
当信号和槽没有必要继续保持连接时,可以通过调用disconnect来断开它们。
bool QObject::disconnect (const QObject sender, const char signal, const Object receiver, const char slot) [static]
有三种情况必须使用 disconnect() 函数:
(1)断开与某个对象相关联的任何对象。
disconnect(sender, 0, 0, 0) ;
//或者
sender->disconnect();
(2)断开与某个特定信号的任何关联。
disconnect(sender, SIGNAL(signal()), 0, 0);```
//或者
sender->disconnect(SIGNAL(signal()));
(3)断开两个对象之间的关联。
disconnect(sender, 0, receiver, 0);
//或者
sender->disconnect(receiver);
信号映射器QSignalMapper类
SignalMapper类可以简单的理解为信号的翻译和转发器, 它可以把一个无参数的信号翻译成带int参数、QString参数、QObject参数或者QWidget参数的信号,并将之转发。经常用在同种却多个信号连接同一个槽的情况下。
//1.第一步:创建信号映射器对象
QSignalMapper *signal_mapper = new QSignalMapper(this);
//2.让同种却多个信号的部件连接信号映射器map槽,map槽会发射mapped信号,mapped信号的参数由setMapping函数的第二个参数决定。
connect(push_button_1, &QPushButton::clicked, signal_mapper, &QSignalMapper::map);
connect(push_button_2, &QPushButton::clicked, signal_mapper, &QSignalMapper::map);
connect(tool_button_1, &QToolButton::clicked, signal_mapper, &QSignalMapper::map);
connect(tool_button_2, &QToolButton::clicked, signal_mapper, &QSignalMapper::map);
//3.设置翻译的内容,也就是第二个参数
signal_mapper->setMapping(push_button_1, QString::number(BUTTON_1, 10));
signal_mapper->setMapping(push_button_2, QString::number(BUTTON_2, 10));
signal_mapper->setMapping(tool_button_1, QString::number(BUTTON_3, 10));
signal_mapper->setMapping(tool_button_2, QString::number(BUTTON_4, 10));
//4.映射器重新发射信号,执行槽函数
connect(signal_mapper, &QSignalMapper::mapped, this, &MyWidget::changeButton);
void MyWidget::changeButton(QString text)
{
int index = text.toInt();
QString information = QString("");
switch(index)
{
case BUTTON_1:
information = QString("clicked 1");
break;
case BUTTON_2:
information = QString("clicked 2");
break;
case BUTTON_3:
information = QString("clicked 3");
break;
case BUTTON_4:
information = QString("clicked 4");
break;
default:
information = QString("which is clicked?");
break;
}
QMessageBox::information(NULL, QString("Title"), information);
}
原文地址:http://blog.51cto.com/12731497/2108631