首先是c++
因为qwidget绘制时默认不绘制自己的stylesheet,所以要对qwidget的paintevent事件进行重写,
下面是c++上的代码
头文件
#include <QWidget>
#include <QPainter>//引入绘制头文件
#include <QStyleOption>
namespace Ui {
class BatteryUi2;
}
class BatteryUi2 : public QWidget
{
Q_OBJECT
public:
explicit BatteryUi2(QWidget *parent = nullptr);
void paintEvent(QPaintEvent *e);//重写方法
~BatteryUi2();
private:
Ui::BatteryUi2 *ui;
};
cpp文件
void BatteryUi2:: paintEvent(QPaintEvent *e){
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
重写后,只要在qtdesigener页面设置stylesheet即可显示
python
但是该方法在python上不起作用
from PyQt5 import QtCore, QtGui, QtWidgets
from batteryui2 import Ui_BatteryUi2
import ui2
class BatteryUi2(QtWidgets.QWidget):
def __init__(self, parent=None):
super(BatteryUi2, self).__init__(parent)
ui = Ui_BatteryUi2()
ui.setupUi(self)
def paintEvent(self, a0: QtGui.QPaintEvent):
opt = QtWidgets.QStyleOption();
opt.initFrom(self)
painter = QtGui.QPainter(self)
self.style().drawPrimitive(QtWidgets.QStyle.PE_Widget,opt,painter,self)
虽然写的过程跟c++一模一样,但是在python上运行仍然不出现stylesheet,具体原因还不知道,接下来给出解决办法
首先,在Ui.py把qwidget里设置stylesheet的地方删掉,只删除父widget就行,然后在代码里设置stylesheet即可,因为ui界面和代码设置会有冲突,不执行代码的,所以一定要把ui里面的stylesheet删掉!!!
def __init__(self, parent=None):
super(BatteryUi2, self).__init__(parent)
ui = Ui_BatteryUi2()
ui.setupUi(self)
self.setStyleSheet("#BatteryUi2 {border-image: url(:/resourse/ui2/u3_bg.png);}")//在代码里面设置
def paintEvent(self, a0: QtGui.QPaintEvent):
opt = QtWidgets.QStyleOption();
opt.initFrom(self)
painter = QtGui.QPainter(self)
self.style().drawPrimitive(QtWidgets.QStyle.PE_Widget,opt,painter,self)
最后即可成功运行,记得把qrc文件转化为py引入,否则会找不到。
踩的一个坑,贼难受
在Qt5中,当使用QWidget时,直接设置样式表(stylesheet)可能无效。对于C++,需要重写paintEvent事件来实现背景显示。而在Python环境下,相同的方法却无法奏效。解决Python中的问题,需要删除UI文件中QWidget的stylesheet,并在代码中设置,以避免UI界面和代码设置冲突。确保将qrc文件转换为Python导入,以防止资源找不到。

4207

被折叠的 条评论
为什么被折叠?



