发现一个问题,当自定义属性的类,不加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();
}