Qt学习总结(C鱼)之信号与槽01

自动关联

第一种自然是手动关联了,只要调用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);
}

猜你喜欢

转载自blog.51cto.com/12731497/2108631