我相信 QGraphics 是完全自定义图形界面的正确途径,但如果你想尝试一些不需要你改变太多现有方法的东西,你可以使用自定义绘制事件做一个小部件:
这是用 PyQt 编写的,但您可以轻松地转换为 Qt
from PyQt4 import QtCore, QtGui
class LabelButton(QtGui.QWidget):
clicked = QtCore.pyqtSignal()
def __init__(self, labelStr, pixStr, parent=None):
super(LabelButton, self).__init__(parent)
self.label = labelStr
self.pix = QtGui.QPixmap(pixStr)
def paintEvent(self, event):
super(LabelButton, self).paintEvent(event)
rect = event.rect()
painter = QtGui.QPainter(self)
painter.drawPixmap(rect, self.pix)
pos = (rect.bottomLeft()+rect.bottomRight()) / 2
pos.setY(pos.y()-10)
painter.drawText(pos, self.label)
painter.end()
def mousePressEvent(self, event):
event.accept()
self.clicked.emit()
def handleClick():
print "CLICK"
if __name__ == "__main__":
app = QtGui.QApplication([])
widget = LabelButton("A Text Label", "myImage.png")
widget.resize(600,400)
widget.show()
widget.raise_()
widget.clicked.connect(handleClick)
app.exec_()
这是一个粗略的例子。您可以对文本的绘制进行更精细的调整。这个小部件接受一个标签字符串和一个图片路径,并将图片绘制为背景,将文本绘制为标签。您可以在绘制事件以及自定义信号和事件中使用此自定义小部件执行任意数量的操作。