回調函數使用(三)

1.最近在研究太陽神三國殺源碼,在三國殺的源碼中採用不少函數指針的方式進行數據傳遞,感受很實用,函數

class ConfigDialog : public FlatDialog {
    Q_OBJECT
public:
    ConfigDialog(QWidget *parent = 0);
    ~ConfigDialog();

private:
    Ui::ConfigDialog *ui;

    typedef void (ConfigDialog::*Callback) (const QVariant &); //採用QVariant類型能夠任意轉換
    QList<Callback> resetCallbacks; //保存函數指針
    QVariantList callbackArgs;     //保存參數
    void doCallback(Callback callback, const QVariant &oldValue, const QVariant &newValue);
    void setBackground(const QVariant &path);
    void on_resetBgButton_clicked();
}

ConfigDialog::ConfigDialog(QWidget *parent)
    : FlatDialog(parent, false), ui(new Ui::ConfigDialog)
{
    ui->setupUi(this);
}

void ConfigDialog::doCallback(ConfigDialog::Callback callback, const QVariant &oldValue, const QVariant &newValue)
{
    if (!resetCallbacks.contains(callback)) {
        resetCallbacks << callback;
        callbackArgs << oldValue;
    }
    (this->*callback)(newValue);//調用函數指針
}

//相應信號
void ConfigDialog::on_resetBgButton_clicked() {
    QString fileName = "image/backdrop/bg.jpg";
    if (fileName != ui->bgPathLineEdit->text())
        doCallback(&ConfigDialog::setBackground, Config.BackgroundImage, fileName);//進行函數的調用傳遞
}

void ConfigDialog::setBackground(const QVariant &path)
{
    QString fileName = path.toString();
    ui->bgPathLineEdit->setText(fileName);
    Config.BackgroundImage = fileName;

    emit bg_changed();
}

//若是沒有保存數據的話,就感受函數指針的保存內容進行還原
void ConfigDialog::discardSettings()
{
    const int n = resetCallbacks.size();
    for (int i = 0; i < n; ++i)
        (this->*(resetCallbacks[i]))(callbackArgs.at(i));

    resetCallbacks.clear();
    callbackArgs.clear();
}
相關文章
相關標籤/搜索