更多精彩内容 |
---|
👉内容导航 👈 |
👉Qt开发经验 👈 |
1.1 Qt自定义控件是样式表无效的解决方法;
-
在构造函数设置属性:
this->setAttribute(Qt::WA_StyledBackground);
(最好) -
改成继承QFrame,因为QFrame自带paintEvent函数已做了实现,在使用样式表时会进行解析和绘制;
-
新实现QWidget的paintEvent函数时,使用QStylePainter绘制;
void MyWidget::paintEvent(QPaintEvent* e) { QStyleOption option; option.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &option, &p, this); }
1.2 QAbstractSpinBox设置±图标无效问题
-
QAbstractSpinBox
类及其子类控件支持通过buttonSymbols
属性设置使用上下箭头图标、加减图标,但我们常常发现buttonSymbols设置了PlusMinus后还是无法显示加减图标; -
这个问题我不知道是不是qt bug还是使用的问题;
-
解决办法: 通过qss加上边框样式
border: 2px solid red;
就可以了;
1.3 Qss设置自定义属性
-
widget.h
class Widget : public QWidget { Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor ) // 定义属性 public: Widget(QWidget *parent = nullptr); ~Widget(); void setColor(QColor value); // 设置属性函数 QColor color(); // 返回函数 private slots: void on_pushButton_clicked(); private: Ui::Widget *ui; QColor m_color; // 成员属性 };
-
widget.cpp
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); qApp->setStyleSheet("Widget{qproperty-color: red;}"); // 加载Qss样式表 ui->lineEdit->setText(this->m_color.name()); // 获取属性值(这里获取不到) } Widget::~Widget() { delete ui; } /** * @brief 设置属性值,Qss调用这个函数 * @param value */ void Widget::setColor(QColor value) { m_color = value; } QColor Widget::color() { return m_color; } void Widget::on_pushButton_clicked() { ui->lineEdit->setText(this->m_color.name()); // 获取属性值 }
-
实现效果: 从图中可以看见,加载Qss后再构造函数中无法获取到属性值,也就是说在构造函数中还没生效;
-
注意: 最好是使用qApp设置Qss,否则如果使用this设置则其它窗口无法获取到qss。
1.4 QSpinBox样式
QSpinBox {
background-color: rgb(0, 255, 255);
border-image: url(:/C:/Users/MHF/Pictures/1.png); /* 输入部分背景*/
color: rgb(255, 255, 255);
border: 2px solid #FF0000;
margin-left: 30px; /* 左边距 */
margin-right: 30px; /* 右边距*/
}
/* 设置使用加减图标的样式*/
QAbstractSpinBox::up-button {
subcontrol-origin: border;
subcontrol-position: right;
border: 1px solid grey;
width: 30px;
height: 30px;
right: -30px;
background-color: rgb(255, 255, 255);
}
QAbstractSpinBox::down-button {
subcontrol-origin: border;
subcontrol-position: left;
border: 1px solid grey;
width: 30px;
height: 30px;
left: -30px;
background-color: rgb(255, 255, 255);
}