这是第二次发布此问题。因为第一个没有表现出任何努力。
我想创建简单的绘画应用程序,它只包含黑/白笔和画布。所以要创建我的绘画应用程序,我想知道我应该使用哪个类。或者是否有由Qt创建的开源软件?
我知道有QPainter课程。那么使用QPainter是正确的方法吗?我听说它是低级图形工具。那么更有用吗?我认为以下源代码是painter app的实现之一。但这是正确的方式吗?我认为还有更好的方法。
我的代码: https://gist.github.com/keimina/469fa17508ae2c0c90c4#file-simplepaintapp-py
from PySide.QtGui import QApplication, QMainWindow, QAction, QActionGroup, QWidget, QCursor, QPainter
from PySide.QtCore import QTimer
import PySide.QtCore as QtCore
class W(QWidget):
def __init__(self):
QWidget.__init__(self)
self.resize(400,400)
self.myIsMousePressing = False
self.p = QPainter(self)
self.autoFillBackground()
self.x = 0
self.y = 0
self.r = dict()#{(x,Y,49, 49):rect}
self.penColor = 1
def mousePressEvent(self, event):
self.myIsMousePressing = True
def mouseReleaseEvent(self, event):
self.myIsMousePressing = False
def myTimeOut(self):
if self.myIsMousePressing:
pos = self.mapFromGlobal(QCursor.pos())
self.x = pos.x()/50
self.y = pos.y()/50
self.r[(self.x*50, self.y*50, 49, 49)] = self.penColor
def paintEvent(self, event):
self.p.begin(self)
for k in self.r.keys():
if self.r[k] == 1:
self.p.setPen(QtCore.Qt.black)
self.p.setBrush(QtCore.Qt.black)
else:
self.p.setPen(QtCore.Qt.white)
self.p.setBrush(QtCore.Qt.white)
self.p.drawRect(*k)
self.p.end()
self.update()
class MyWidget(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setMinimumSize(400, 400)
self.initMenu()
self.w = W()
self.setCentralWidget(self.w)
self.t = QTimer(self.w)
self.t.timeout.connect(self.w.myTimeOut)
self.t.start(1)
def initMenu(self):
self.fileMenu = self.menuBar().addMenu("&File")
self.editMenu = self.menuBar().addMenu("&Edit")
self.helpMenu = self.menuBar().addMenu("&Help")
self.fileMenuAction = QAction("&New", self)
self.editMenuAction1 = QAction("&Black", self)
self.editMenuAction2 = QAction("&White", self)
self.helpMenuAction = QAction("&About", self)
actGroup = QActionGroup(self)
actGroup.addAction(self.editMenuAction1)
actGroup.addAction(self.editMenuAction2)
self.editMenuAction1.setCheckable(True)
self.editMenuAction2.setCheckable(True)
self.editMenuAction1.setChecked(True)
self.fileMenu.addAction(self.fileMenuAction)
self.editMenu.addAction(self.editMenuAction1)
self.editMenu.addAction(self.editMenuAction2)
self.helpMenu.addAction(self.helpMenuAction)
self.editMenuAction1.triggered.connect(self.action1)
self.editMenuAction2.triggered.connect(self.action2)
def action1(self):
self.w.penColor = 1
def action2(self):
self.w.penColor = 2
app = QApplication([])
mainWin = MyWidget()
mainWin.show()
app.exec_()
感谢。
P.S。我正在使用PySide,但任何其他Qt都可以。
答案 0 :(得分:2)
QPainter
本质上是唯一的方法,缺少操纵QImage
中的单个像素,或使用OpenGL在Qt中绘制内容。所以它的使用不言而喻,如果你在Qt中绘画,你将不得不使用QPainter
。这就是绘画的方式。但这与人类可能用来“绘画”的应用程序无关。我们正在讨论的绘画是您的应用程序必须做的事情,无论用户在做什么,都要向用户展示。
你要问的是Qt中是否存在特定于应用程序的内容,这有助于实现“绘图”应用程序。如果您正在使用矢量绘图应用程序,那么图形场景框架可能会有用。否则,没有什么可以帮助你的。您必须从普通QWidget
开始,并实施您需要的行为。