zoukankan      html  css  js  c++  java
  • 回调函数使用(三)

    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();
    }
  • 相关阅读:
    聚集索引
    第一天 尝试Thread
    sql 分区函数
    sql 查询表定义
    千万数量级分页存储过程
    成语解释
    sql 分组查询满足条件所以数据
    sql存储过程
    联表更新的反思
    从表保存了主表的id,以分号分隔,怎么样用一条sql搞定主表满足条件的查询? 不希望单独写存储过程,或者后台拆成int后传进来,就一条sql 搞定,一条
  • 原文地址:https://www.cnblogs.com/Travis990/p/4585954.html
Copyright © 2011-2022 走看看