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();
    }
  • 相关阅读:
    git .gitignore不生效的解决方法
    python 爬虫中常需要睡眠防止被封IP time sleep
    Python 实现字典操作详解
    Python遍历字典到列表中出现覆盖前面数据或者字典对值(值为列表)赋值出现重复的问题
    小红书app之shield 逆向
    淘宝h5 页面 sign加密算法
    jemter-base64加密
    Python 中更优雅的日志记录方案
    logging再学习
    elasticsearch中must和should条件同时满足
  • 原文地址:https://www.cnblogs.com/Travis990/p/4585954.html
Copyright © 2011-2022 走看看