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();
    }
  • 相关阅读:
    UVA 562 Dividing coins --01背包的变形
    HDU 2602 Bone Collector --01背包
    Topcoder SRM 618 Div2 --900
    【转】Python 列表排序
    线段树之区间最大连续和问题
    【转】Python中string的strip,lstrip,rstrip用法
    《Python核心编程》部分代码习题实践(持续更新)
    《Python核心编程》部分错误纠正(勘误表)(持续更新)
    UVA 103 Stacking Boxes --LIS
    POJ 1836 Alignment --LIS&LDS
  • 原文地址:https://www.cnblogs.com/Travis990/p/4585954.html
Copyright © 2011-2022 走看看