2014-07-20 107 views
0

這是第二次發佈這個問題。因爲第一個沒有顯示任何努力。我應該使用什麼類來創建Qt的繪畫應用程序?

我想創建一個簡單的繪畫應用程序,只包括黑色/白色筆和畫布。因此,要創建我的繪畫應用程序,我想知道我應該使用什麼類。還是有繪畫軟件是開源的,由Qt創建的?

我知道有QPainter類。所以使用QPainter是正確的方法?我聽說它是​​低級圖形工具。那麼還有更有用的嗎?我認爲下面的源代碼是畫家應用程序的實現之一。但這是正確的方式嗎?我認爲還有更好的方法。

我的代碼: 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都可以。

回答

2

QPainter本質上是唯一的方法,它不能操縱QImage中的單個像素或使用OpenGL繪製Qt中的某些東西。所以它的使用不言而喻,如果你在Qt中繪製,你將不得不使用QPainter。這就是繪畫完成的方式。但是這與人類可能用於「繪製」的應用程序無關。我們正在談論的這幅畫是你的應用程序必須做的,以向用戶展示一些東西,而不管用戶在做什麼。

你問的是,如果有什麼特定於Qt的應用程序可以幫助實現「繪圖」應用程序。如果你在一個矢量繪圖應用程序之後,那麼圖形場景框架可能是有用的。否則,沒有什麼可以幫助你。您必須以簡單的QWidget開頭並實施您所需的行爲。

+0

謝謝。我知道有非矢量繪圖和矢量繪圖應用程序。我想創建一個像win95 mspaint之前的版本。 –

相關問題