Q_PROPERTY 自定义属性不生效

发现一个问题,当自定义属性的类,不加Q_OBJECT,那么此类的自定义属性,不能被外界更改使用

class COnlyPushNormalBtn : public QPushButton
{
    Q_OBJECT //发现必须要加这个宏
    Q_PROPERTY(bool isJogMode READ getIsJogMode WRITE setIsJogMode DESIGNABLE true)
    Q_PROPERTY(bool fixMoveChecked READ getFixMoveChecked WRITE setFixMoveChecked DESIGNABLE true)
public:
    COnlyPushNormalBtn(QWidget *parent = nullptr);
    bool getIsJogMode() const;
    void setIsJogMode(bool value);
    bool getFixMoveChecked() const;
    void setFixMoveChecked(bool value);
protected:
    virtual void mousePressEvent(QMouseEvent *event) override;
    virtual void mouseReleaseEvent(QMouseEvent *event) override;
private:
    bool isJogMode;//是否是点动按钮模式:鼠标点击按下,松开弹起
    bool fixMoveChecked;//定长运动时,是否按下
};
#include "conlypushnormalbtn.h"

COnlyPushNormalBtn::COnlyPushNormalBtn(QWidget *parent):QPushButton(parent),
  isJogMode(true),
  fixMoveChecked(false)
{
}

bool COnlyPushNormalBtn::getIsJogMode() const
{
    return isJogMode;
}

void COnlyPushNormalBtn::setIsJogMode(bool value)
{
    if(value && (isJogMode!=value)){//从定长运动切换到点动模式
        this->setAttribute(Qt::WA_TransparentForMouseEvents,false);
        this->setChecked(false);
        this->setCheckable(false);
        fixMoveChecked = false;
    }else if(!value && (isJogMode!=value)){//从点动切换到定长运动
        this->setCheckable(true);
    }
    isJogMode = value;
}

void COnlyPushNormalBtn::mousePressEvent(QMouseEvent *event)
{
    QPushButton::mousePressEvent(event);
}

void COnlyPushNormalBtn::mouseReleaseEvent(QMouseEvent *event)
{
    QPushButton::mouseReleaseEvent(event);
    if(!isJogMode){
        fixMoveChecked = true;
        this->setAttribute(Qt::WA_TransparentForMouseEvents,true);
    }
}

bool COnlyPushNormalBtn::getFixMoveChecked() const
{
    return fixMoveChecked;
}

void COnlyPushNormalBtn::setFixMoveChecked(bool value)
{
    if(!isJogMode){
        this->setChecked(value);
        this->setAttribute(Qt::WA_TransparentForMouseEvents, value);
        fixMoveChecked = value;
    }
}

执行操作的地方:这个使用个状态机

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->pushButton->setIsJogMode(!ui->pushButton->getIsJogMode());

    connect(ui->btnCMD,&QPushButton::clicked,this,[=](){
        ui->pushButton->setFixMoveChecked(!ui->pushButton->getFixMoveChecked());
    });
connect(ui->btnCheckable,&QPushButton::pressed,this,[=](){ui->pushButton->setIsJogMode(!ui->pushButton->getIsJogMode());});

    macine = new QStateMachine(this);
    QState *state1 = new QState(macine);
    QState *state2 = new QState(macine);
    macine->setInitialState(state1);
    state1->assignProperty(ui->pushButton,"fixMoveChecked",false);//就是这个状态,当切换状态是,更改相应的属性
    state1->assignProperty(ui->pushButton,"text","1");
    state2->assignProperty(ui->pushButton,"fixMoveChecked",true);//
    state2->assignProperty(ui->pushButton,"text","2");
    state1->addTransition(ui->btnDown,&QPushButton::pressed,state2);
    state2->addTransition(ui->btnDown,&QPushButton::pressed,state1);
    macine->start();
}
### QtProperty Editor 的用法与实现 #### 使用 QDesignerPropertyEditorInterface 类 在 Qt 设计师中,`QDesignerPropertyEditorInterface` 提供了一个接口用于访问和操作控件的属性。该类允许开发者创建自定义属性编辑器,从而扩展默认功能[^1]。通过继承 `QObject` 并实现必要的虚函数,可以构建一个符合特定需求的属性编辑器。 以下是基本步骤: - 创建一个新的类并继承 `QDesignerPropertyEditorInterface`。 - 实现核心方法如 `object()` 和 `setObject(QObject *object)` 来管理当前选中的对象及其属性列表。 ```cpp #include <QDesignerPropertyEditorInterface> #include <QObject> class CustomPropertyEditor : public QObject, public QDesignerPropertyEditorInterface { Q_OBJECT public: explicit CustomPropertyEditor(QObject *parent = nullptr); void setObject(QObject *object) override; QObject *object() const override; private: QObject *_currentObject; }; ``` #### 自定义控件属性编辑器及插件加载 当需要为新开发的控件添加独特的属性支持时,可以通过编写插件的方式集成到 Qt Designer 中[^2]。具体来说,这涉及以下几个方面: 1. **注册新的元数据类型**:利用宏 `Q_DECLARE_METATYPE` 定义任何非标准的数据结构作为可序列化的变量; 2. **设置动态属性**:调用目标 widget 上的相关 API (`setProperty`) 动态绑定额外参数; 3. **打包成库形式分发**:按照官方文档指导完成编译链接过程后部署至指定路径下即可生效。 例如,在项目源码里加入如下片段以暴露某些字段给外部工具识别: ```cpp qRegisterMetaType<MyCustomDataType>("MyCustomDataType"); widget->setProperty("customField", QVariant::fromValue(myDataInstance)); ``` #### 解决常见问题——丢失视图恢复机制 如果遇到工作区内的组件栏消失情况,则可通过简单的交互找回它们的位置[^4]。只需把焦点置于主窗口内部任意位置再执行上下文菜单命令重新激活隐藏部分即可恢复正常布局状态。 对于更复杂的场景比如完全移除了侧边栏等情况下的修复手段还包括但不限于以下几种途径之一: - 尝试重启应用程序清除缓存影响因素; - 手动调整配置文件内容重置界面设定值回到初始条件下去尝试解决此类异常现象的发生概率减少措施应该被考虑进去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青鸟青史

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值