1.前言
版本:Python3.6.1 + PyQt5
寫(xiě)一個(gè)程序的時(shí)候需要用到畫(huà)板/手寫(xiě)板,只需要最簡(jiǎn)單的那種。原以為網(wǎng)上到處都是,結(jié)果找了好幾天,都沒(méi)有找到想要的結(jié)果。
網(wǎng)上的要么是非python版的qt程序(要知道qt版本之間差異巨大,還是非同一語(yǔ)言的),改寫(xiě)難度太大。要么是PyQt4的老程序,很多都已經(jīng)不能在PyQt5上運(yùn)行了。要么是大神寫(xiě)的特別復(fù)雜的程序,簡(jiǎn)直是直接做出了一個(gè)Windows自帶的畫(huà)圖版,只能膜拜~
于是我只能在眾多代碼中慢慢尋找自己需要的那一小部分,然后不斷地拼湊,不斷地理解大神的代碼,最終做出這么一個(gè)簡(jiǎn)單的畫(huà)板。望著這個(gè)簡(jiǎn)單的畫(huà)板我真是淚流滿面,中間數(shù)十次拼不對(duì)拼不全導(dǎo)致程序無(wú)數(shù)次崩潰,差點(diǎn)就放棄了......
2.簡(jiǎn)單的畫(huà)板1.0
在簡(jiǎn)單的畫(huà)板1.0這里,實(shí)現(xiàn)的功能是:在定點(diǎn)和移動(dòng)中的鼠標(biāo)所在處畫(huà)一條線
如圖所示:
鼠標(biāo)按住移動(dòng)的話,線也會(huì)跟著移動(dòng),從這個(gè)簡(jiǎn)單的程序開(kāi)始理解PyQt5的運(yùn)行機(jī)制吧。
''' 簡(jiǎn)單的畫(huà)板1.0 功能:在定點(diǎn)和移動(dòng)中的鼠標(biāo)所在處畫(huà)一條線 作者:PyLearn 最后修改日期: 2017/10/18'''import sysfrom PyQt5.QtWidgets import (QApplication, QWidget)from PyQt5.QtGui import (QPainter, QPen)from PyQt5.QtCore import Qtclass Example(QWidget): def __init__(self): super(Example, self).__init__() #resize設(shè)置寬高,move設(shè)置位置 self.resize(400, 300) self.move(100, 100) self.setWindowTitle("簡(jiǎn)單的畫(huà)板1.0") #setMouseTracking設(shè)置為False,否則不按下鼠標(biāo)時(shí)也會(huì)跟蹤鼠標(biāo)事件 self.setMouseTracking(False) #設(shè)置兩個(gè)變量接收移動(dòng)中的點(diǎn)的x、y坐標(biāo) self.pos_x = 20 self.pos_y = 20 def paintEvent(self, event): painter = QPainter() painter.begin(self) pen = QPen(Qt.black, 2, Qt.SolidLine) painter.setPen(pen) #定點(diǎn)(20, 20) 到 (self.pos_x, self.pos_y)之間畫(huà)線 painter.drawLine(20, 20, self.pos_x, self.pos_y) painter.end() def mouseMoveEvent(self, event): ''' 按住鼠標(biāo)移動(dòng)事件:更新pos_x和pos_y的值 調(diào)用update()函數(shù)在這里相當(dāng)于調(diào)用paintEvent()函數(shù) 每次update()時(shí),之前調(diào)用的paintEvent()留下的痕跡都會(huì)清空 ''' self.pos_x = event.pos().x() self.pos_y = event.pos().y() self.update()if __name__ == "__main__": app = QApplication(sys.argv) pyqt_learn = Example() pyqt_learn.show() app.exec_()3.簡(jiǎn)單的畫(huà)板2.0
從以上的簡(jiǎn)單的畫(huà)板1.0程序的運(yùn)行可以發(fā)現(xiàn),按住鼠標(biāo)移動(dòng)的時(shí)候,線也會(huì)跟著移動(dòng),那如何讓之前的線留下痕跡,而不是消失呢?
在簡(jiǎn)單的畫(huà)板2.0中,使用一個(gè)列表保存所有移動(dòng)過(guò)的點(diǎn),然后要畫(huà)線的時(shí)候,循環(huán)遍歷列表,依次畫(huà)出列表中點(diǎn)到定點(diǎn)之間的線即可。
新聞熱點(diǎn)
疑難解答
圖片精選