pyqt的不规则窗口和按钮图片的问题

209 views
Skip to first unread message

jamie sun

unread,
Jul 4, 2009, 11:58:15 AM7/4/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
我想做个完全用图片自定义风格的界面,类似个性播放器。
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吗





jamie sun

unread,
Jul 4, 2009, 12:38:29 PM7/4/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
问题解决了,按钮图片样式是可以完全显示的,灰色背景被去掉了。

QT真的很强大。

Kermit Mei

unread,
Jul 4, 2009, 9:20:21 PM7/4/09
to pyth...@googlegroups.com

自己定义背景在Qt中一般不是重写paintEvent的,而是使用style,即从QStyle继
承子类,或者用setStyleSheet()设置一个风格脚本,我喜欢使用setStyleSheet,
工作量小,而且更灵活,不过这个功能好像是Qt4.3.0以后的版本才有的。
不知道PyQt能否使用。

给个例子:
pBtn->setStyleSheet("border-image:url(:/images/mybutton.png);");


jamie sun

unread,
Jul 5, 2009, 3:50:47 AM7/5/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
pBtn->setStyleSheet("border-image:url(:/images/mybutton.png);");
这种方法我试过了,在qt设计器中预览是可以显示的,但我在pyqt中运行却不行,不知道是不是我的环境有问题,我要多十几下确认到底是不是这样

jamie sun

unread,
Jul 5, 2009, 4:41:05 AM7/5/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)

On 7月5日, 下午3时50分, jamie sun <jamiesun....@gmail.com> wrote:
> pBtn->setStyleSheet("border-image:url(:/images/mybutton.png);");
> 这种方法我试过了,在qt设计器中预览是可以显示的,但我在pyqt中运行却不行,不知道是不是我的环境有问题,我要多十几下确认到底是不是这样

如果我不用自己实现的QWidget的子类setStyleSheet是有效的
看来问题出现在我自己实现的子类上,到底咋回事呢

Reply all
Reply to author
Forward
0 new messages