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(); }