文章目錄
PyQt5程序基本格式
QMainWindow主窗口
QLabel標簽
QTextBrowser文本瀏覽器
QTextEdit文本編輯器
QPushButton按鍵
QCheckBox復選框
QRadioButton單選按鈕
QMessageBox彈框
QSlider滑動條
QDialog提示窗口
QFileDialog打開文件或文件夾
QTreeView目錄樹結構
QTimer計時器
QSystemTrayIcon托盤
常用操作
獲取屏幕分辨率
獲取屏幕截圖
設置窗口隨內容大小自動變化
獲取鼠標事件
QPixmap對象轉字節流
PyQt5程序基本格式
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel
from ui import Ui_MainWindow # 由qtdesigner 生成的布局
class MyApp(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MyApp, self).__init__()
self.setupUi(self)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
QMainWindow主窗口
設置主窗口屬性,居中顯示
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QMainWindow, QDesktopWidget, QApplication
class MyApp(QMainWindow):
def __init__(self):
super(MyApp, self).__init__()
self.resize(512, 512) # 設置窗口的大小
self.status = self.statusBar() # 實例化創建狀態欄
self.status.showMessage('狀態欄提示', 4000) # # 將提示信息顯示在狀態欄中showMessage(‘提示信息’,顯示時間(單位毫秒))
self.setWindowTitle('主窗口標題') # 設置窗口標題
self.setWindowIcon(QIcon('logo.png')) # 設置圖標
self.move_center()
def move_center(self):
screen = QDesktopWidget().screenGeometry()
form = self.geometry()
x_move_step = (screen.width() - form.width()) / 2
y_move_step = (screen.height() - form.height()) / 2
self.move(x_move_step, y_move_step)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
QLabel標簽
顯示讀取文字
label = QLabel(self)
label.setText("顯示內容") # 寫入
text = label.text() # 讀取
顯示圖片
label = QLabel(self)
pixmap = QPixmap("文件路徑")
label.setPixmap(pixmap)
label.setScaledContents(True) # 設置圖片隨QLabel大小縮放
label.setAlignment(Qt.AlignCenter) # 設置圖像居中顯示
結合opencv顯示圖片(方便處理圖像)
label = QLabel(self)
label.setPixmap(QPixmap("")) # 移除QLabel上的圖片
img = cv2.imread("文件路徑") # 讀取圖片,路徑不能有中文
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # bgr -> rgb
h, w, c = img.shape # 獲取圖片形狀
image = QImage(img, w, h, 3 * w, QImage.Format_RGB888)
pixmap = QPixmap.fromImage(image)
label.setPixmap(pixmap)
label.setScaledContents(True) # 設置圖片隨QLabel大小縮放
QTextBrowser文本瀏覽器
設置, 追加, 獲取文本
text_browser = QTextBrowser(self)
text_browser.setText(a) # 設置文本
text_browser.append(a) # 追加文本
text = text_browser.toPlainText() # 獲取文本
QTextEdit文本編輯器
設置, 追加, 獲取文本
text_edit = QTextEdit(self)
text_edit.setText(a) # 設置文本
text_edit.append(a) # 追加文本
text = text_edit.toPlainText() # 獲取文本
QPushButton按鍵
按下觸發事件
button = QPushButton(self)
button .setChecked() # 設置為可選中
button.clicked.connect(clicked_function) # 按下觸發
def clicked_function():
pass
QCheckBox復選框
check_box = QCheckBox(self)
check_box.setChecked() # 默認設置為選中
check_box.setCheckable(True) # 設置為可被選中
check_box.stateChanged.connect(check_box_changed) # 狀態改變觸發check_box_changed函數
def use_external_camera(self, status):
if status == Qt.Checked: # 若狀態為選中
pass
else:
pass
QRadioButton單選按鈕
radio_button1 = QRadioButton()
radio_button2 = QRadioButton()
radio_button1.setChecked(True) # 設置選中,同時只能有一個選中
radio_button1.toggled.connect(radio_button_changed) # 按下觸發radio_button_changed函數
radio_button2.setChecked(False) # 設置非選中
radio_button2.toggled.connect(radio_button_changed) # 按下觸發radio_button_changed函數(共用同一個函數)
def radio_button_changed():
if radio_button1.isChecked(): #返回是否選中
pass
elif radio_button2.isChecked():
pass
QMessageBox彈框
QMessageBox對話框包含類型只是圖標不同其他無太大差別:
QMessageBox.information 信息框
QMessageBox.question 問答框
QMessageBox.warning 警告
QMessageBox.ctitical 危險
QMessageBox.about 關於
reply = QMessageBox.information(self, "標題", "消息", QMessageBox.Yes | QMessageBox.No)
if reply==QMessageBox.Yes:
...
else:
...
QSlider滑動條
滑動條設置上下限, 設置當前值, 滑動觸發事件
slider = QSlider()
slider.setOrientation(Qtcore.Qt.Horizontal) # 設置為水平滑動條
# slider.setOrientation(Qtcore.Qt.Vertical) # 設置為豎直滑動條
slider.setMaximum(100) # 設置最大值
slider.setMinimum(0) # 設置最小值
slider.setValue(72) # 設置當前值
value = slider.value() #獲取當前值
slider.valueChanged.connect(change_function) # 改變值時觸發change_function函數
QDialog提示窗口
dialog = QDialog()
dialog.adjustSize() # 隨內容自動改變大小
text = QLineEdit(message, dialog) # 添加空間顯示提示文字
text.adjustSize()
# 設置窗口的屬性為ApplicationModal模態,用戶只有關閉彈窗后,才能關閉主界面
dialog.setWindowModality(Qt.ApplicationModal)
dialog.exec_() # 阻塞執行,只調用show執行后立馬銷毀
QFileDialog打開文件或文件夾
QFileDialog.getOpenFileName 獲取文件名
QFileDialog.getExistingDirectory 獲取文件夾名
file_name, _ = QFileDialog.getOpenFileName(self, '標題', './', 'Image files(*.jpg *.gif *.png)') # 可設置默認路徑與可選文件類型
folder_name = QFileDialog.getExistingDirectory(self, '標題', './') # 可設置默認路徑
QTreeView目錄樹結構
創建目錄樹結果並顯示當前路徑的樹結構,雙擊文件觸發函數
tree_model = QDirModel()
# 或者
# tree_model = QFileSystemModel()
# tree_model.setRootPath(os.getcwd()) # 設置根目錄為當前目錄
tree_view = QTreeView()
tree_view.setModel(tree_model )
tree_view.setRootIndex(self.dirModel.index(os.getcwd())) # 設置當前目錄(沒有這句話則為默認C盤路徑)
tree_view.setWindowTitle(self.treeView.tr("當前目錄")) # 顯示title...好像沒啥用
treeView.doubleClicked.connect(tree_cilcked_function) # 雙擊文件觸發tree_cilcked_function函數
tree_view.show()
# 函數調用方式
def tree_cilcked_function(self, file_index):
file_name = tree_model.filePath(file_index)
...
QTimer計時器
設置計時時間,時間到觸發時間,循環執行
timer = QTimer()
timer.timeout.connect(process_function)
timer.start(20) # 設置計時時間為20ms,並啟動計時器
timer.stop() # 停止計時器
def process_function():
···
QSystemTrayIcon托盤
tray = QSystemTrayIcon(QIcon('./icon/cut.png'), self) # 創建系統托盤對象,傳入主窗口
tray.activated.connect(func) # 設置托盤點擊事件處理函數
tray_menu = QMenu(QApplication.desktop()) # 創建菜單
action1 = QAction(u'還原 ', self, triggered=func2) # 添加一級菜單動作選項(還原主窗口)
action2 = QAction(u'退出 ', self, triggered=fun3) # 添加一級菜單動作選項(退出程序)
tray_menu.addAction(action1) # 為菜單添加動作
tray_menu.addAction(action2)
tray.setContextMenu(tray_menu) # 設置系統托盤菜單
tray.show()
常用操作
獲取屏幕分辨率
desktop = QApplication.desktop()
# 獲取顯示器分辨率大小
screenRect = desktop.screenGeometry()
height = self.screenRect.height()
width = self.screenRect.width()
獲取屏幕截圖
screen = QApplication.primaryScreen()
pixmap = screen.grabWindow(0)
設置窗口隨內容大小自動變化
QWidget().adjustSize()
獲取鼠標事件
def mousePressEvent(self, QMouseEvent):
pass
def mouseReleaseEvent(self, QMouseEvent):
pass
def mouseMoveEvent(self, QMouseEvent):
pass
QMouseEvent的常用屬性
QMouseEvent.x() # 鼠標坐標x
QMouseEvent.y() # 鼠標坐標y
QMouseEvent.button() # 按鈕,枚舉類型 Qt.LeftButton / Qt.RightButton
QPixmap對象轉字節流
shot_bytes = QByteArray()
buffer = QBuffer(shot_bytes)
buffer.open(QIODevice.WriteOnly)
shot_img = self.get_shot_img()
shot_img.save(buffer, 'png') # 保存到buffer對象
data = shot_bytes.data()
QTableView
import sys
from
PyQt5
import
QtCore,QtGui
from
PyQt5.QtWidgets
import
QApplication, QMainWindow
from
PyQt5.uic
import
loadUi
class
MainWindow(QMainWindow):
def
__init__(
self
, parent
=
None
):
super
(MainWindow,
self
).__init__(parent)
loadUi(
'qtdesigner.ui'
,
self
)
self
.pushButton.clicked.connect(
self
.say)
self
.showData()
def
say(
self
):
self
.label.setText(
"哈哈哈"
)
print
(
"哈哈哈"
)
def
showData(
self
):
# 准備數據模型
self
.sm
=
QtGui.QStandardItemModel()
#設置數據頭欄名稱
self
.sm.setHorizontalHeaderItem(
0
, QtGui.QStandardItem(
"Name"
))
self
.sm.setHorizontalHeaderItem(
1
, QtGui.QStandardItem(
"NO."
))
#設置數據條目
self
.sm.setItem(
0
,
0
, QtGui.QStandardItem(
"張三"
))
self
.sm.setItem(
0
,
1
, QtGui.QStandardItem(
"20120202"
))
self
.sm.setItem(
1
,
0
, QtGui.QStandardItem(
"李四"
))
self
.sm.setItem(
1
,
1
, QtGui.QStandardItem(
"20120203000000000000000"
))
self
.sm.setItem(
2
,
0
, QtGui.QStandardItem(
"李四"
))
self
.sm.setItem(
2
,
1
, QtGui.QStandardItem(
"20120203000000000000000"
))
self
.sm.setItem(
3
,
0
, QtGui.QStandardItem(
"李四"
))
self
.sm.setItem(
3
,
1
, QtGui.QStandardItem(
"20120203000000000000000"
))
self
.sm.setItem(
4
,
0
, QtGui.QStandardItem(
"李四"
))
self
.sm.setItem(
4
,
1
, QtGui.QStandardItem(
"20120203000000000000000"
))
self
.sm.setItem(
5
,
0
, QtGui.QStandardItem(
"李四"
))
self
.sm.setItem(
5
,
1
, QtGui.QStandardItem(
"20120203000000000000000"
))
#設置條目顏色和字體
self
.sm.item(
0
,
0
).setForeground(QtGui.QBrush(QtGui.QColor(
255
,
0
,
0
)))
self
.sm.item(
0
,
0
).setFont(QtGui.QFont(
"Times"
,
10
, QtGui.QFont.Black))
self
.sm.item(
3
,
1
).setBackground(QtGui.QBrush(QtGui.QColor(
255
,
255
,
0
)))
#按照編號排序
self
.sm.sort(
1
, QtCore.Qt.DescendingOrder)
#將數據模型綁定到QTableView
self
.tableView.setModel(
self
.sm)
#QTableView
self
.tableView.setColumnWidth(
0
,
100
)
self
.tableView.setColumnWidth(
1
,
200
)
app
=
QApplication(sys.argv)
w
=
MainWindow()
w.show()
sys.exit(app.
exec
())
for i in range(self.sm.rowCount()): if self.sm.item(i,0) != None and len(self.sm.item(i,0).text()) > 0: dataItem = {} dataItem[0] = self.sm.item(i,0).text() sheet.cell(i+1, 1).value = self.tbView.item(i,0).text() if self.sm.item(i,1) != None and len(self.sm.item(i,1).text()) > 0: dataItem[1] = self.sm.item(i,1).text() sheet.cell(i+1, 2).value = self.sm.item(i,1).text() else: dataItem[1] = '' sheet.cell(i+1, 2).value = '' self.replaceData[i] = dataItem[0] + ',' + dataItem[1]
