專案中遇到乙個需求就是讀取dvr板上的所有檔案,並模擬windows上的磁碟管理,將所有檔案所占用的空間以及未占用空間都標記出來。
在這裡貼上實現模擬磁碟管理的部分**,記錄一下。
環境如下:pycharm+python3.6+pyqt5。
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "嗯顧"
import sys
from pyqt5 import qtgui
from pyqt5.qtcore import qobject, qt, pyqtsignal
from pyqt5.qtgui import qpainter, qcolor, qpen
class communicate(qobject):
update_widget = pyqtsignal(int, int)
class drawwidget(qwidget):
used_val_list =
used_add_val_list =
used_dict = {}
used_index = 0
start_add = 0
end_add = 0
del_flag = 0
sum_row = 0
def __init__(self, parent=none):
super(qwidget, self).__init__(parent)
self.initui()
def initui(self):
self.setmousetracking(true)
self.setminimumsize(1, 30)
def setvalue(self, start_val, end_val):
self.start_add = start_val
self.end_add = end_val
self.used_index += 1
def paintevent(self, e):
qp = qpainter()
qp.begin(self)
self.drawwidget(qp)
qp.end()
def drawwidget(self, qp):
pen = qpen(qcolor(20, 20, 20), 0.5, qt.solidline)
qp.setpen(pen)
qp.setbrush(qcolor(255, 255, 255))
qp.drawrect(0, 0, self.size().width()-1, self.size().height()-1)
start_val = int(((self.size().width() / 227540992.0) * self.start_add))
end_val = int(((self.size().width() / 227540992.0) * self.end_add))
self.used_add_val_list = [self.start_add, self.end_add, start_val, end_val]
self.used_dict[self.used_index] = self.used_add_val_list
for i in range(self.used_index + 1):
qp.setpen(pen)
qp.setbrush(qcolor(0, 0, 255))
qp.drawrect(self.used_dict.get(i)[3], 0, self.used_dict.get(i)[2] - self.used_dict.get(i)[3],
self.size().height() - 1)
def sequencesearch(self, value):
value = (value * 227540992) / self.size().width()
self.used_val_list.sort()
for i in range(len(self.used_val_list)):
if value > self.used_val_list[i] and value < self.used_val_list[i+1]:
return self.used_val_list[i], self.used_val_list[i+1]
elif value > self.used_val_list[-1]:
return self.used_val_list[-1], 227540992
elif value < self.used_val_list[0] and self.used_val_list[0] != 0:
return 0, self.used_val_list[0]
return -1
def mousemoveevent(self, a0: qtgui.qmouseevent):
if self.sequencesearch(a0.x()) == -1 or self.sequencesearch(a0.x()) == none:
self.settooltip('')
return
else:
start_val, end_val = self.sequencesearch(a0.x())
self.settooltip(
str(hex(start_val)[2:].zfill(8).upper()) + '-' + str(hex(end_val)[2:].zfill(8).upper()))
class space(qwidget):
def __init__(self, parent=none):
super(qwidget, self).__init__(parent)
self.initui()
def initui(self):
self.text1 = qlineedit(self)
self.text1.setgeometry(30, 10, 100, 30)
self.text2 = qlineedit(self)
self.text2.setgeometry(150, 10, 100, 30)
self.btn1 = qpushbutton(self)
self.btn1.settext("點我")
self.btn1.setgeometry(270, 10, 100, 30)
self.btn2 = qpushbutton(self)
self.btn2.settext("清空")
self.btn2.setgeometry(390, 10, 100, 30)
self.communicate = communicate(self)
self.widget = drawwidget(self)
self.widget.setgeometry(30, 60, 500, 30)
self.lab = qlabel(self)
self.lab.settext("第乙個輸入框的值為占用空間的起始位址,第二個輸入框的值為占用空間的結束位址。\r\n\r\n總空間位址範圍為00000000~0d900000,已占用空間為藍色。\r\n\r\n"
"滑鼠放置在某塊區域上,即可出現該塊區域的位址範圍。")
self.lab.setgeometry(30, 100, 600, 80)
self.communicate.update_widget[int, int].connect(self.widget.setvalue)
self.btn1.clicked.connect(self.changevalue)
self.btn2.clicked.connect(self.clearvalue)
self.setgeometry(300, 300, 600, 180)
self.setwindowtitle("test")
self.show()
def changevalue(self):
val1 = int(self.text1.text())
val2 = int(self.text2.text())
self.communicate.update_widget.emit(val1, val2)
self.widget.repaint()
def clearvalue(self):
self.widget.used_val_list.clear()
self.widget.used_dict.clear()
self.widget.used_index = -1
self.widget.repaint()
self.text1.clear()
self.text2.clear()
if __name__ == "__main__":
ex = space()
在此附上執行效果:
PyQt5布局管理之QFormLayout 四
qformlayout是label field式的表單布局,顧明思議,就是實現表單方式的布局,表單是提示使用者進行互動的一種模式,主要有兩列組成,第一列用於顯示資訊,給使用者提示,一般叫做label域,第二列需要使用者進行選擇或輸入,一般叫做field域,label與field的關係就是label關...
學習PyQt5(三) PyQt5的訊號和槽
我 如圖所示,我們建立乙個按鈕及乙個瀏覽器。什麼是訊號?比如按鈕的單擊,雙擊,按下,釋放等,都可以認為是乙個訊號 什麼是槽?對應的訊號,做出什麼應對,這要乙個應對在乙個函式中,我們可以認為這就是乙個訊號 槽關係 在qt designer中點選工具欄 注意不是工具盒 中的這個圖示 點選這個圖示後,就進...
PYQT5模擬中獎小遊戲
開發環境 visual studio code 作業系統 microsoft window 10 python版本 3.7 我們將按下列步驟構建輸出頁面 1 pyqt設計介面 2 物件命名 3 訊號和槽如下圖所示 4 唯讀設定 前四個隨機數處設定為唯讀。4 參考例程 系統包 import sys i...