窗體設計html
qtdesigner經過組建拖拽作界面很簡單,網上教程也不少,可是樣式設計的進階教程倒是很難找到。想要作一個相似QQ登陸界面並不簡單。設計登陸界面以下:python
主要的困難在於須要去掉窗口的標題欄,沒有標題欄就不能關閉和最小化,也不能進行窗口的拖拽,因此須要重寫最小化和關閉按鍵,以及實現拖拽,代碼入下:編程
self.close.clicked.connect(QCoreApplication.instance().quit)
self.bmin.clicked.connect(self.showMinimized)
關閉按鍵和最小化按鍵響應事件設置ide
# 重寫三個方法使窗口支持拖動,上面參數window就是拖動對象 def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.m_drag = True self.m_DragPosition = event.globalPos() - self.pos() event.accept() self.setCursor(QCursor(Qt.OpenHandCursor)) def mouseMoveEvent(self, QMouseEvent): if Qt.LeftButton and self.m_drag: self.move(QMouseEvent.globalPos() - self.m_DragPosition) QMouseEvent.accept() def mouseReleaseEvent(self, QMouseEvent): self.m_drag = False self.setCursor(QCursor(Qt.ArrowCursor))
想要讓界面更加美化一點須要用到QSS(樣式表),很遺憾關於樣式表教程並很少,QSS相似網頁設計CSS(就是來源於吧==)函數
以關閉按鈕舉例:實現按鈕,鼠標選中和鼠標按下三種不一樣狀況的貼圖優化
圖片素材:對應三種按鍵狀況ui
"QPushButton{background-image:url(./qrc/btn_close_mormal.png);width:39px;height:18px;padding-top:0px;border:0px;}" "QPushButton:hover{background-image:url(./qrc/btn_close_highligt.png)}" "QPushButton:pressed{background-image:url(./qrc/btn_close_down.png)}"
分別定義三種情形的QSS樣式表,在代碼中用setStyleSheet("qss")函數進行設置。url
滑塊與微調框spa
設計用戶選擇題目數量的部分,我選擇了滑塊組件,能夠很方便的限制題目範圍在10-30之內,可是滑塊並不能顯示數字,因而我加了spinBox(微調框)來選擇題目數和顯示數字命令行
如何把滑塊與微調框的值綁定起來,百度後知道是須要分別寫兩個組建的valueChanged的槽函數,也沒找到源碼實例,就只有本身寫了。
self.nub_horizontalSlider.valueChanged.connect(self.spin_change) #類中加入事件 self.nub_spinBox.valueChanged.connect(self.slider_change) ''' -------------------------------------------------------------------------- ''' def spin_change(self): #綁定滑塊與控件,使其中一個改變另外一個也改變 self.nub_spinBox.setValue(self.nub_horizontalSlider.value()) def slider_change(self): self.nub_horizontalSlider.setValue(self.nub_spinBox.value())
倒計時
在作題過程當中,須要加入考試倒計時,當倒計時結束中止答題。倒計時我經過數碼管組建來作,可是因爲時間匆忙,並無達到我想要的樣子。
倒計時要用到QTimer模塊,經過一個定時器得到時鐘頻率,就和硬件實訓的定時器差很少。
from PyQt5.QtCore import QTimer #窗口類中加入定時器 self.timer = QTimer(self) self.timer.timeout.connect(self.timer_oprate) self.timer.start(1000) #槽函數,計數-1,當爲0時關閉窗口 def timer_oprate(self): self.time_lcdNumber.display(self.time_lcdNumber.intValue()-1) if self.time_lcdNumber.intValue() == 0: self.myWin5 = ui_score.MyWindow5() self.myWin5.show() self.hide()
打開網頁連接
個人小夥伴還寫了一個html的誠信考試協議,嘻嘻,不籤協議怎麼能讓你考試呢是吧:)
打開本地html文件我是經過os模塊執行start命令行命令來實現,可是有個問題是打開的時候會出現黑窗口閃爍,這個bug尚未解決。
程序打包
終於完成項目後怎麼能不和小夥伴們分享呢(特別是讓家裏的弟弟妹妹感覺一下被算術統治的恐怖hhh)。
python打包的方法有幾種,經常使用的是Py2exe和PyInstaller,由於前者用於老版本的python,可能打包過程當中會出現各類問題,我選擇了或者。安裝方式很簡單,直接pip install PyInstaller。
pyinstaller語法也簡單執行命令: pyinstaller main.py
main.py是我程序入口,固然個人工程裏不能只有一個py文件,因此你會發現這樣打包後的exe並不能用QAQ
加上-w參數,會遞歸打包引用的其餘py: pyinstaller -w main.py
(我試過加上-F,打包成一個文件,可是最後的exe並不能運行,我也不知道爲啥)
而後會看到新增長了兩個目錄build和dist,dist下面的文件夾裏的exe就是能夠發佈的可執行文件。固然,得把你的資源文件複製到文件夾下面。EXE文件會自動加上一個圖標,若是想改本身的圖標輸入pyinstaller時命令添加一個 -i picture.ioc(路徑),太懶(困)我就沒弄…
點擊main.exe就能夠運行了,其實這個課執行文件比我想象中的要小,才1608K,固然包括其餘動態庫就不止這點了,QT的一個很差的地方就是設計的程序會比通常其餘開發環境的大上一些。
固然,以爲這麼多文件不美觀,ctrl+shift拖動文件在桌面建個快捷方式吧。