Qt之动态属性unpolish()和polish()

Qt的动态属性unpolish()和polish()

1. Qt中的属性

  • 属性是指窗口或控件的属性,比如opacity属性表示“透明度”,geometry指的是“位置和大小”,pos属性代表“位置”。qt中的控件有自带的属性,我们也可以自己定义属性。QObject这个类有一个函数setProperty,我们可以通过这个函数定义自己的属性,使用方法很简单,setProperty(const
    char * name, const QVariant &
    value),第一个参数是属性的名称,第二个参数是属性值。除了上面的方法,还有一种自定义属性的方法,就是在一个继承自QObject的类中使用 Q_PROPERTY 宏指令,简单用法如下:
    Q_PROPERTY(bool focus READ hasFocus) 
    Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
    Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)
    
    Q_PROPERTY(参数类型 参数名称 READ 获得属性值函数 WRITE 设置属性值函数)
    比如Q_PROPERTY(bool bIsDoubi READ getDoubi WRITE setDoubi );
    其中,属性类型是bool类型,bIsDoubi是属性名称。除此之外还需要写两个函数,第一个是设置属性的函数void
    setDoui(bool),第二个是获得属性的函数bool getDoubi()。

2. 自定义属性有什么作用

  • 目前所知的自定义属性有两个用途,第一是用于改变样式,第二是用于动画,下面分别作解释:

1)改变样式

翻开Qt助手,找到样式表语法部分,在通过选择器设置样式中有一个属性选择器,比如QPushButton[flat=“false”]意思就是当按钮属性flat为false时的样式。
举个栗子,我们有个QWidget类,名字叫PropertyTest,界面中有一个按钮叫pushButton

#pushButton{border:4px solid blue;}
PropertyTest[borderColor="red"] #pushButton{border:4px solid red;}
 PropertyTest[borderColor="green"] #pushButton{border:4px solid green;}
 PropertyTest[borderColor="blue"] #pushButton{border:4px solid blue;}

按钮默认样式是blue蓝色,通过改变类PropertyTest的属性borderColor值改变按钮的颜色。
在代码中,首先定义属性

Q_PROPERTY(QString borderColor READ getBorderColor WRITE setBorderColor)

使用一个成员变量保存属性的值,并通过set和get函数分别设置和获得该值。

private:    
QString m_strBorderColor;
private:    
void setBorderColor(const QString &strBorderColor){ m_strBorderColor = strBorderColor; }   
QString getBorderColor(){ return m_strBorderColor; }

单击按钮pushButton改变属性值,从而改变按钮pushButton的样式。

void PropertyTest::changeBorderColor()
{
    if (m_iTest % 3 == 0)    
    {        
    	setBorderColor("red");    
    }    
    else if (m_iTest % 3 == 1)   
     {        
     	setBorderColor("green");    
     }    
     else   
      {        
      	setBorderColor("blue");    
      }    
      style()->unpolish(ui.pushButton_3);    
      style()->polish(ui.pushButton_3);    
      update();    
      m_iTest++;
      }

最后要注意的是,上面代码中的unpolish和polish部分。
在Qt文档中有个提醒,在使用属性选择器时,如果之前控件有其它样式,那么需要重写设置一下,“旧的不去,新的不来”,通过unpolishpolish抹去旧的样式,涂上新的样式。

2)动画中使用自定义属性

  • 如果我们想通过动画使一个按钮逐渐变透明,思路会是这样:按钮QPushButton继承自QWidget,在QWidget中有个函数setWindowOpacity,所以只需使用动画类QPropertyAnimation,属性那个参数设置为windowOpacity。
    然而,实际中,按钮透明度不会有任何改变,继续查看文档才知道——只有调用setWindowFlags函数,将窗口属性设置为Qt::Window,windowOpacity这个属性才能生效。但是这样做pushbutton就不是正常的widget了。
    因此,有必要寻求其它方法,在QWidget中有一个函数setGraphicsEffect(QGraphicsEffect *),其中QGraphicsEffect有一个派生类QGraphicsOpacityEffect,可以通过它来设置QWidget的透明度
m_pOpacityEffect = new QGraphicsOpacityEffect(this);
m_pOpacityEffect->setOpacity(1);
this->setGraphicsEffect(m_pOpacityEffect);

Q_PROPERTY(qreal buttonOpacity READ buttonOpacity WRITE setBtnOpacity)

上面的写法可能不太好,因为qreal精度与机器有关,最好用double或float。
定义属性时,在函数setBtnOpacity中改变QGraphicsOpacityEffect对象,来调整透明度。
好了,现在我们将动画属性名称设置为buttonOpacity—— QPropertyAnimation::setPropertyName(“buttonOpacity”) ,就能通过动画改变按钮的透明度了。

### QT 中用于显示报警信息的控件 在 QT 中,可以使用多种方式实现报警信息的显示功能。以下是几种常见的方法及其具体实现: #### 方法一:使用 `QMessageBox` 显示报警提示 `QMessageBox` 是一种简单的对话框组件,适合用来显示警告、错误或其他消息。可以通过设置图标文本内容来创建一个报警窗口。 ```cpp void showAlarmMessage(const QString& message) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(message); msgBox.setWindowTitle("报警"); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } ``` 这种方法适用于需要弹窗提醒用户的场景[^1]。 --- #### 方法二:自定义报警指示灯(基于 `QWidget` 或 `QPushButton`) 如果需要更灵活的设计,比如模拟灯光闪烁效果,则可以利用 `QWidget` 自绘或者修改 `QPushButton` 的样式表来实现。 ##### 使用 QPushButton 实现: 通过动态更改按钮的颜色属性,模拟灯光亮起或熄灭的效果。 ```cpp class AlarmIndicator : public QPushButton { public: explicit AlarmIndicator(QWidget* parent = nullptr) : QPushButton(parent), isOn(false) {} void setAlarmState(bool state) { isOn = state; updateStyle(); } private: bool isOn; void updateStyle() { if (isOn) { this->setStyleSheet("background-color: red; border-radius: 10px;"); } else { this->setStyleSheet("background-color: gray; border-radius: 10px;"); } } }; ``` 此代码片段展示了如何通过改变颜色表示报警状态的变化[^5]。 --- #### 方法三:结合数据库操作展示实时报警数据 当涉及到复杂的业务逻辑时,通常会将报警信息存储到数据库中,并通过查询结果显示给用户。此时可以在 UI 上绑定特定区域更新这些记录。 例如,在 `MainWindow` 类中的某个槽函数处理新收到的数据包并刷新列表视图: ```cpp void MainWindow::updateAlarmsFromDatabase() { QSqlQuery query; query.prepare("SELECT id, description FROM alarms WHERE status='active'"); if (!query.exec()) { qDebug() << "Error fetching active alarms:" << query.lastError().text(); return; } while (query.next()) { int alarmId = query.value(0).toInt(); QString desc = query.value(1).toString(); // 假设有一个 QListWidget 来承载所有活动告警项 ui->alarmList->addItem(QString("%1 - %2").arg(alarmId).arg(desc)); } } ``` 上述示例假设存在名为 `alarms` 的表结构以及对应的字段名匹配情况[^3]。 --- #### 方法四:全局样式控制下的视觉反馈机制 对于整个应用程序统一管理外观风格的情况,也可以借助 CSS 样式表技术完成特殊样式的定制化需求。下面是一个关于红色背景高亮某输入框的例子: ```css /* 定义样式 */ .QLineEdit[error="true"] { background-color: pink; } // 应用该规则至目标对象上 lineEditObj.setProperty("error", true); lineEditObj.style()->unpolish(lineEditObj); lineEditObj.style()->polish(lineEditObj); ``` 这段脚本说明了怎样标记出错位置以便引起注意[^4]。 --- ### 总结 以上介绍了四种不同的解决方案分别针对不同层次的需求进行了阐述——从基础的消息盒通知直到深入集成后台服务端口同步呈现最新动态变化状况等功能模块设计思路均有所涉及。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值