37,719
社区成员
发帖
与我相关
我的任务
分享
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.setFixedSize(400, 400)
self.scrollarea = QScrollArea(self)
self.scrollarea.setFixedSize(300, 300)
self.show()
def paintEvent(self, event):
# 在QMainWindow上绘图,正常运行
# qp = QPainter(self)
# 在QScrollArea上绘图,提示错误
qp = QPainter(self.scrollarea)
# 蓝色,粗细为2,实线
pen = QPen(Qt.blue, 2, Qt.SolidLine)
qp.setPen(pen)
# 画一个直径400的圆
qp.drawEllipse(0, 0, 400, 400)
app = QApplication(sys.argv)
win = MyWindow()
sys.exit(app.exec_())
QPainter::begin: Widget painting can only begin as a result of a paintEvent
if __name__ == "__main__":
再次感谢你<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MyPaintWidget</class>
<widget class="QWidget" name="MyPaintWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>201</width>
<height>221</height>
</rect>
</property>
<property name="windowTitle">
<string>画图</string>
</property>
<widget class="QPushButton" name="pushButtonClearTheChar">
<property name="geometry">
<rect>
<x>10</x>
<y>190</y>
<width>91</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Clear</string>
</property>
</widget>
<widget class="QSpinBox" name="spinBoxDrawWidth">
<property name="geometry">
<rect>
<x>70</x>
<y>0</y>
<width>42</width>
<height>16</height>
</rect>
</property>
</widget>
<widget class="MyLabel" name="labelTheChar">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>181</width>
<height>161</height>
</rect>
</property>
<property name="palette">
<palette>
<active>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="text">
<string>TextLabel</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget>
<widget class="QLabel" name="labelDrawWidth">
<property name="geometry">
<rect>
<x>10</x>
<y>0</y>
<width>61</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>画笔粗细:</string>
</property>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>MyLabel</class>
<extends>QLabel</extends>
<header>mylabel.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
self.labelTheChar = MyLabel(MyPaintWidget)
是如何做到的呢?
是你后期添加的,还是直接通过ui文件转换过来的??#coding:utf-8
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.setFixedSize(400, 400)
self.scrollArea = QScrollArea(self)
self.scrollArea.setFixedSize(300, 300)
self.myWidget = MyWidget()
self.myWidget.setFixedSize(400,400)
self.scrollArea.setWidget(self.myWidget)
self.scrollArea.show()
self.show()
class MyWidget(QWidget):
def __init__(self):
super(MyWidget, self).__init__()
def paintEvent(self, event):
qp = QPainter(self)
# 蓝色,粗细为2,实线
pen = QPen(Qt.blue, 2, Qt.SolidLine)
qp.setPen(pen)
# 画一个直径400的圆
qp.drawEllipse(0, 0, 400, 400)
app = QApplication(sys.argv)
win = MyWindow()
sys.exit(app.exec_())
我也初学python,有另外的方法创建自定义的类包含QLabel,QPainter,QPixmap在paintEvent外绘图,实现比较难看,弄ing。。#coding:utf-8
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.setFixedSize(400, 400)
self.scrollArea = QScrollArea(self)
self.scrollArea.setFixedSize(300, 300)
self.myWidget = MyWidget()
self.myWidget.setFixedSize(400,400)
self.scrollArea.setWidget(self.myWidget)
self.scrollArea.show()
self.show()
class MyWidget(QWidget):
def __init__(self):
super(MyWidget, self).__init__()
def paintEvent(self, event):
qp = QPainter(self)
# 蓝色,粗细为2,实线
pen = QPen(Qt.blue, 2, Qt.SolidLine)
qp.setPen(pen)
# 画一个直径400的圆
qp.drawEllipse(0, 0, 400, 400)
app = QApplication(sys.argv)
win = MyWindow()
sys.exit(app.exec_())
我也初学python,有另外的方案用自定义的类包含QLabel,QPainter,QPixmap在paintEvent外绘图,实现很难看,正在弄。。from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyLabel(QLabel):
def __init__(self,parent = None):
super(MyLabel,self).__init__(parent)
self._drawText = QString()
self._painter = QPainter()
self._backColor = QColor(0,0,0)
self._pen = QPen(self._backColor)
self._pixmap = QPixmap()
self._mouseLastX = int()
self._mouseLastY = int()
self._mouseDownX = int()
self._mouseDownY = int()
@pyqtSlot()
def clear(self):
super(MyLabel,self).clear()
self._pixmap.fill(self._backColor)
super(MyLabel,self).setPixmap(self._pixmap)
self.update()
def setGeometry(self, rect):
super(MyLabel,self).setGeometry(rect)
self._pixmap = QPixmap(rect.size())
self.clear()
def setPen(self,pen):
self._pen = pen
if self._painter.isActive():
self._painter.setPen(pen)
def setBackColor(self,color):
self._backColor = color
self.clear(self)
def beginPaint(self):
if not self._pixmap.size().isEmpty():
self._painter.begin(self._pixmap)
self.setPen(self._pen)
def endPaint(self):
if self._painter.isActive():
self._painter.end()
self.update()
def setPixmap(self,pixmap):
self._pixmap = pixmap
self.update()
def mousePressEvent(self,ev):
self.emit(SIGNAL('on_mousePress'),ev)
self._mouseLastX = ev.x()
self._mouseLastY = ev.y()
self._mouseDownX = self._mouseLastX
self._mouseDownY = self._mouseDownY
def mouseMoveEvent(self,ev):
self.emit(SIGNAL('on_mouseMove'),ev)
#self._signal_on_mouseMove.emit()
self._mouseLastX = ev.x()
self._mouseLastY = ev.y()
def mouseReleaseEvent(self,ev):
self.emit(SIGNAL('on_mouseRelease'),ev)
#self._signal_on_mouseRelease.emit()
def paintEvent(self,ev):
self._painter.begin(self)
self._painter.drawPixmap(QPoint(0,0),self._pixmap)
self._painter.drawText(self._pixmap.rect(),Qt.AlignCenter,self._drawText)
self._painter.end()
MyWidget.py
#coding:utf-8
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from MyPaintWidget import Ui_MyPaintWidget
class MyWidget(QWidget):
def __init__(self,parent = None):
super(MyWidget,self).__init__(parent)
self.ui = Ui_MyPaintWidget()
self.ui.setupUi(self)
self.labelTheChar = self.ui.labelTheChar
self.spinBoxDrawWidth = self.ui.spinBoxDrawWidth
self.show()
def on_mouseMove(self,ev):
self.labelTheChar.beginPaint()
if ((ev.buttons() & Qt.LeftButton) or (ev.buttons() & Qt.RightButton)):
self.labelTheChar._painter.drawLine(self.labelTheChar._mouseLastX, self.labelTheChar._mouseLastY, ev.x(), ev.y())
self.labelTheChar.endPaint()
def on_mousePress(self,ev):
self.labelTheChar.beginPaint()
if (ev.buttons() & Qt.LeftButton):
self.labelTheChar.setPen(QPen(QColor(255, 255, 255), float(self.spinBoxDrawWidth.text()), Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
self.labelTheChar._painter.drawPoint(ev.x(), ev.y())
elif (ev.buttons() & Qt.RightButton):
self.labelTheChar.setPen(QPen(QColor(0, 0, 0), float(self.spinBoxDrawWidth.text()), Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
self.labelTheChar._painter.drawPoint(ev.x(), ev.y())
self.labelTheChar.endPaint()
app = QApplication(sys.argv)
myWidget = MyWidget()
labelTheChar = myWidget.labelTheChar
spinBoxDrawWidth = myWidget.spinBoxDrawWidth
labelTheChar.setPen(QPen(QBrush(QColor(255, 255, 255)), int(spinBoxDrawWidth.text()), Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin));
QObject.connect(labelTheChar, SIGNAL('on_mouseMove'), myWidget.on_mouseMove)
QObject.connect(labelTheChar, SIGNAL('on_mousePress'), myWidget.on_mousePress)
spinBoxDrawWidth.setRange(1, 50)
spinBoxDrawWidth.setValue(5)
QObject.connect(myWidget.ui.pushButtonClearTheChar, SIGNAL('clicked()'), labelTheChar, SLOT('clear()'))
sys.exit(app.exec_())
MyPaintWidget.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'F:\PythonProject\LearnProjects\TestProjects\MyPaintWidget.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MyPaintWidget(object):
def setupUi(self, MyPaintWidget):
MyPaintWidget.setObjectName(_fromUtf8("MyPaintWidget"))
MyPaintWidget.resize(201, 221)
self.pushButtonClearTheChar = QtGui.QPushButton(MyPaintWidget)
self.pushButtonClearTheChar.setGeometry(QtCore.QRect(10, 190, 91, 23))
self.pushButtonClearTheChar.setObjectName(_fromUtf8("pushButtonClearTheChar"))
self.spinBoxDrawWidth = QtGui.QSpinBox(MyPaintWidget)
self.spinBoxDrawWidth.setGeometry(QtCore.QRect(70, 0, 42, 16))
self.spinBoxDrawWidth.setObjectName(_fromUtf8("spinBoxDrawWidth"))
self.labelTheChar = MyLabel(MyPaintWidget)
self.labelTheChar.setGeometry(QtCore.QRect(10, 20, 181, 161))
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
self.labelTheChar.setPalette(palette)
self.labelTheChar.setAutoFillBackground(True)
self.labelTheChar.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.labelTheChar.setObjectName(_fromUtf8("labelTheChar"))
self.labelDrawWidth = QtGui.QLabel(MyPaintWidget)
self.labelDrawWidth.setGeometry(QtCore.QRect(10, 0, 61, 16))
self.labelDrawWidth.setObjectName(_fromUtf8("labelDrawWidth"))
self.retranslateUi(MyPaintWidget)
QtCore.QMetaObject.connectSlotsByName(MyPaintWidget)
def retranslateUi(self, MyPaintWidget):
MyPaintWidget.setWindowTitle(_translate("MyPaintWidget", "画图", None))
self.pushButtonClearTheChar.setText(_translate("MyPaintWidget", "Clear", None))
self.labelTheChar.setText(_translate("MyPaintWidget", "TextLabel", None))
self.labelDrawWidth.setText(_translate("MyPaintWidget", "画笔粗细:", None))
from MyLabel import MyLabel
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MyPaintWidget = QtGui.QWidget()
ui = Ui_MyPaintWidget()
ui.setupUi(MyPaintWidget)
MyPaintWidget.show()
sys.exit(app.exec_())