Qt6.0 qproperty-*不生效原因

2年前 (2022) 程序员胖胖胖虎阿
286 0 0

qt的qss样式是可以使用基本属性和property属性的,比如我们想改变组件的minimumSize有两种方法

1.代码里写

qLabel->setMinimumSize (100,200);

2.qss里写

QLabel{
    qproperty-minimumSize:100px 200px;
}

但是,你会发现有些property属性写了不生效,比如说(它用了枚举值)

QLabel{
    qproperty-alignment:AlignCenter;
}

在有些论坛里有说是可以这么写的
Qt6.0 qproperty-*不生效原因

什么原因呢?估计是在旧版本里Qt对AlignCenter字符串做了解析,新版本里不再识别它了,那么怎么解决呢?使用Qt::AlignCenter或Qt.AlignCenter?都是不行的,我们知道枚举值默认情况下都是int型的,那么我们直接设置int是不是就可以?

ok,那么我们打印下AlignCenter的值

qDebug() << Qt::AlignCenter << static_cast<int>(Qt::AlignCenter);

Qt6.0 qproperty-*不生效原因

QLabel{
background-color:red;
qproperty-alignment:132;
}

Qt6.0 qproperty-*不生效原因

ok,它生效了~

但是写这个我们还得去查AlignCenter对应的值,太麻烦了,怎么做才能实现跟QT4一样,我写AlignCenter你就帮我居中呢?

在setStyleSheet前增加内容处理,对样式文件内容进行正则替换,把写的枚举变量替换成真正的枚举值即可。

方法定义和实现

template <typename T>
void insertQtStyleEnumMap();
QString replaceQtStyleEnumValue(const QString &str);
QMap<QString, int> m_qtStyleEnumMap;

QString StyleHelper::replaceQtStyleEnumValue(const QString &str) {
  QString result = str;
  QMap<QString, int>::Iterator it = m_qtStyleEnumMap.begin();
  while (it != m_qtStyleEnumMap.end()) {
    result.replace(it.key(), QString::number(it.value()));
    it++;
  }
  return result;
}

template <typename T>
void StyleHelper::insertQtStyleEnumMap() {
  QMetaEnum metaEnum = QMetaEnum::fromType<T>();
  for (int i = 0; i < metaEnum.keyCount(); i++) {
    m_qtStyleEnumMap.insert(metaEnum.key(i), metaEnum.value(i));
  }
}
insertQtStyleEnumMap<Qt::Alignment>();//在初始化的时候调用

style = replaceQtStyleEnumValue(style);  //setStyleSheet前替换枚举变量
qApp->setStyleSheet(style);

这个时候样式再写

QLabel{
background-color:red;
qproperty-alignment:AlignCenter;
}

就跟写132是一样的了

版权声明:程序员胖胖胖虎阿 发表于 2022年10月8日 上午7:16。
转载请注明:Qt6.0 qproperty-*不生效原因 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...