我想做个完全用图片自定义风格的界面,类似个性播放器。
google到的文档都是c++的,编码的时候发现还是有很大不同
#include <QtGui/QPixmap>
#include <QtGui/QBitmap>
#include "toolbutton.h"
#include "form.h"
Form::Form()
{
QPalette p = palette();
QPixmap img("a.png");
QBitmap mask("mask.png");
p.setBrush(QPalette::Window, QBrush(img));
setPalette(p);
setMask(mask);
setWindowFlags(Qt::FramelessWindowHint);
resize(600, 400);
ToolButton *button = new ToolButton(this);
button->move(200, 200);
}
Form::~Form()
{
}
这是c++实现不规则窗口的做法,但pyqt里QPalette不能设置图形像素,只能设置颜色(ColorGroup )
最后只好重写paintEvent的方法来设置背景图片,在重绘后任然要调用setMask,不然不能实现不规则形状
图片一般是png带透明通道。
代码如下:
from PyQt4 import QtCore, QtGui
class IWindow(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.pen = QtGui.QPen()
self.brush = QtGui.QBrush()
self.antialiased = False
self.transformed = False
self.pixmap = QtGui.QPixmap()
self.pixmap.load("images/mediabg.png")
self.setBackgroundRole(QtGui.QPalette.Base)
self.setObjectName("Form")
self.setMouseTracking(True)
self.setWindowFlags(self.windowFlags() |
QtCore.Qt.FramelessWindowHint)
self.setWindowTitle(
self.tr("Shaped Analog Clock"))
self.resize(385, 301)
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.dragPosition = event.globalPos() - self.frameGeometry
().topLeft()
event.accept()
def mouseMoveEvent(self, event):
if event.buttons() == QtCore.Qt.LeftButton:
self.move(event.globalPos() - self.dragPosition)
event.accept()
def paintEvent(self, event):
painter = QtGui.QPainter()
painter.begin(self)
painter.drawPixmap(0, 0, self.pixmap)
self.setMask(self.pixmap.mask())
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = IWindow()
pushButton = QtGui.QToolButton(MainWindow)
pushButton.setGeometry(QtCore.QRect(90, 70, 141, 51))
pushButton.setIcon(QtGui.QIcon("images/mac.png"))
pushButton.setIconSize(QtCore.QSize(137, 51))
pushButton.setMask(QtGui.QPixmap("images/mac2.png").mask())
MainWindow.show()
sys.exit(app.exec_())
--------------------------------------------------------------------------------------------------
现在郁闷的是
pushButton = QtGui.QPushButton(MainWindow)
pushButton.setGeometry(QtCore.QRect(90, 70, 141, 51))
pushButton.setIcon(QtGui.QIcon("images/mac2.png"))
pushButton.setIconSize(QtCore.QSize(137, 51))
pushButton.setMask(QtGui.QPixmap("images/mac2.png").mask())
这段代码无效,用QToolButton也不行,按钮不能去掉背景而显示纯粹的带透明通道的图形样式按钮,难道也要重写paintEvent吗