Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

macro/keyboard shortcut to auto-gen slot/signal for variable



  • I would like to be able to define a macro in QtCreator that would allow me to create a "mutator slot with signal" automatically in my C++ header file. For example, if the cursor is on a variable such as:
    QList<Frob> m_yadda;
    it would be nice to auto-generate in the "signals:" section the following:
    yadda(QList<Frob>);
    and in the "public slots:" section the following:
    void setYadda(QList<Frob> newYadda) { m_yadda = newYadda; emit yadda(m_yadda); }

    I find that I cannot look at the Tools->Options->Environment->Keyboard and type in the text editing window to generate a macro for this at the same time. This makes it a bit of a challenge. Ideally I'd like to create this macro and save it to a key binding so that it is always available. Are there any macro ninjas who could take a stab at creating this macro or adding it as a default feature to QtCreator? Either that or tell me what I'm missing to be able to generate this. I can do it in emacs, and eclipse has the ability to generate setter/getters as a built-in. I just want it in QtCreator.



  • can you try this, maybe it not exactly what you want,

    #define PROPERTY(type, name)\
        Q_PROPERTY(type name READ get_##name WRITE set_##name NOTIFY name##Changed)\
        public:\
        type name;\
        type get_##name() const {return name;}\
        void set_##name(type name) { if(this->name != name) {this->name=name; emit name##Changed();}}\
        Q_SIGNAL void name##Changed();
    
    

    Then in class you just need using it

    Class Person: public QObject {
    Q_OBJECT
    Q_PROPERTY(QString, name)
    }
    

    [edit:koahnig] Code markers



  • @kd_wala

    Usage would be:

    Class Person: public QObject {
        Q_OBJECT
        PROPERTY(QString, name)
    }
    

    Wouldn't it?


  • Qt Champions 2017

    @iraytrace79
    Right clicking on a QString m_testText member and selecting Refactor > Create Getter and Setter Member Functions does most of what you want. For me (Qt Creator 4.0.3) it generates:

    QString TestClass::testText() const
    {
        return m_testText;
    }
    
    void TestClass::setTestText(const QString & testText)
    {
        m_testText = testText;
    }
    

    As for macros, I don't know if Qt creator supports macros.



  • @koahnig , sorry, actually, we need define one constructor for this, i define another macro,
    #define BEGIN_MODEL(name)\
    class name: public QObject\
    {\
    public:\
    name(QObject *parent = 0): QObject(parent){}\
    virtual ~name(){}

    #define END_MODEL };

    Then declare one model object like
    BEGIN_MODEL(Person)
    Q_OBJECT
    PROPERTY(QString, name)
    END_MODEL

    i not move Q_OBJECT to macro BEGIN_MODEL, because it relate to qmake that generate moc_ files and cause error,
    this is one way to simple define model,
    ps: but using macro is not recommended, because it have some trouble for debug


Log in to reply