我应该用什么类来创建Qt的绘画应用程序?

时间:2014-07-20 21:37:43

标签: qt pyqt pyside

这是第二次发布此问题。因为第一个没有表现出任何努力。

我想创建简单的绘画应用程序,它只包含黑/白笔和画布。所以要创建我的绘画应用程序,我想知道我应该使用哪个类。或者是否有由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都可以。

1 个答案:

答案 0 :(得分:2)

QPainter本质上是唯一的方法,缺少操纵QImage中的单个像素,或使用OpenGL在Qt中绘制内容。所以它的使用不言而喻,如果你在Qt中绘画,你将不得不使用QPainter。这就是绘画的方式。但这与人类可能用来“绘画”的应用程序无关。我们正在讨论的绘画是您的应用程序必须做的事情,无论用户在做什么,都要向用户展示。

你要问的是Qt中是否存在特定于应用程序的内容,这有助于实现“绘图”应用程序。如果您正在使用矢量绘图应用程序,那么图形场景框架可能会有用。否则,没有什么可以帮助你的。您必须从普通QWidget开始,并实施您需要的行为。