1. 程式人生 > >Qt學習總結(C魚)之信號與槽01

Qt學習總結(C魚)之信號與槽01

Qt 學習 總結 C魚

自動關聯

第一種自然是手動關聯了,只要調用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);
}

Qt學習總結(C魚)之信號與槽01