获取文件路径方法 sys.argv
print(sys.argv)
path=os.path.realpath(sys.argv[0])
print(path)
# 输出
['E:/desktop/pyqt5_516/test.py']
E:\desktop\pyqt5_516\test.py
窗口类
- QWidget 控件和窗口的父类
- QMainWindow 包含 菜单栏,工具栏,状态栏,标题栏等, 为主窗口区域
- QDialog 对话框
QWidget
class mywnd(QWidget):
def __init__(self):
super(mywnd, self).__init__()
self.initUI()
def initUI(self):
label = QLabel("xxx" )
label.setStyleSheet("font-size:30px;color:red")
label.setParent(self)
QMainWindow
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
label = QLabel("这是文字~~")
label.setStyleSheet("font-size:30px;color:red")
# 调用父类中的menuBar,从而对菜单栏进行操作
menu = self.menuBar()
file_menu = menu.addMenu("文件")
file_menu.addAction("新建")
file_menu.addAction("打开")
file_menu.addAction("保存")
QDialog
class MyDialog(QDialog):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
ok_btn = QPushButton("确定", self)
ok_btn.setGeometry(50, 50, 100, 30)
基本UI (窗口的控件在窗口显示需要表明他的父亲是谁再进行show展示)
按钮QPushButton,文本QLabel,文本框QLineEdit
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit
from PyQt5.QtGui import QIcon
if __name__ == '__main__':
w = QWidget()
w.setWindowTitle("PyQt5--学习") # 窗口标题
w.setWindowIcon(QIcon('test.jpg')) # 设置窗口 logo
# 调整大小和位置
w.resize(100,100) # w,h 调整窗口大小
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
# 在窗口里面添加控件按钮QPushButton
btn = QPushButton("按钮")
# 设置按钮的父亲是当前窗口,等于是添加到窗口中显示
btn.setParent(w)
# 文本 QLabel
label = QLabel("xxx: ", w)
# 显示位置与大小 : x, y , w, h
label.setGeometry(20, 20, 30, 30)
# 文本框 QLineEdit
edit = QLineEdit(w)
edit.setPlaceholderText("请输入账号")
edit.setGeometry(55, 20, 200, 20)
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
布局 ~ 水平-垂直-表单-抽屉布局
在Qt里面布局分为四个大类 :
- QBoxLayout 主要属性 addStretch(x) 弹簧、addWidget(x) 添加
- QHBoxLayout 水平
- QVBoxLayout 垂直
- QGridLayout 网格布局 主要属性 addWidget(btn,x,y) btn为组件 x,y 为第x行,第y列
- QFormLayout
- addRow 添加 行信息
- QStackedLayout 抽屉布局
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("垂直布局")
# 垂直布局 (同水平布局)
layout = QVBoxLayout()
# 作用是在布局器中增加一个伸缩量,默认值为零
layout.addStretch(1)
btn1 = QPushButton("按钮1")
# 添加到布局器中
# layout.addWidget(btn1, Qt.AlignmentFlag.AlignTop)
layout.addWidget(btn1)
layout.addStretch(1)
btn2 = QPushButton("按钮2")
# 添加到布局器
layout.addWidget(btn2)
data = {
0: ["7", "8", "9", "+", "("],
1: ["4", "5", "6", "-", ")"],
}
# 网格布局
grid = QGridLayout()
# 循环创建追加进去
for line_number, line_data in data.items():
# 此时line_number是第几行,line_data是当前行的数据
for col_number, number in enumerate(line_data):
# 此时col_number是第几列,number是要显示的符号
btn = QPushButton(number)
grid.addWidget(btn, line_number, col_number)
# 把网格布局追加到容器中
layout.addLayout(grid)
# 表单容器
form_layout = QFormLayout()
# 创建输入框
edit = QLineEdit()
edit.setPlaceholderText("请输入账号")
form_layout.addRow("账号:", edit)
edit2 = QLineEdit()
edit2.setPlaceholderText("请输入密码")
form_layout.addRow("密码:", edit2)
# 将from_layout添加到垂直布局器中
layout.addLayout(form_layout)
self.setLayout(layout)
QTableWidget 表格布局
class MyTableWidget(QTableWidget):
def __init__(self, rows, columns, parent=None):
super().__init__(rows, columns, parent)
# 设置表头
self.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3'])
self.setVerticalHeaderLabels(['Row 1', 'Row 2', 'Row 3'])
# 填充表格
for row in range(rows):
for column in range(columns):
item = QTableWidgetItem(f"Cell {row},{column}") # 添加表信息
self.setItem(row, column, item)
表格右键复制-查看-清除信息功能
- CustomContextMenu 菜单设置
- customContextMenuRequested 自定义菜单
- table_widget.selectedItems 表格的选择信息获取
- QApplication.clipboard() # 复制信息到剪切板
setWindowModality
NonModal 非模态窗口。用户可以与该窗口以及其他窗口进行交互,无需关闭该窗口即可切换到其他窗口。
WindowModal:窗口模态。当用户与该窗口交互时,他们将无法与其他属于同一父窗口或顶级窗口的窗口进行交互,直到关闭该模态窗口为止。但是,他们可以与其他不相关的应用程序窗口进行交互。
ApplicationModal:应用程序模态。这是最严格的模态类型。当用户与该窗口交互时,他们将无法与应用程序中的任何其他窗口进行交互,直到关闭该模态窗口为止。此时,整个应用程序将被阻塞,直到用户完成与模态窗口的交互。
# 开启右键复制功能,在表格中点击右键时,自动触发 right_menu 函数
table_widget.setContextMenuPolicy(Qt.CustomContextMenu) # 设置部件上下午菜单策略
table_widget.customContextMenuRequested.connect(self.table_right_menu) # 自定义菜单
table_layout.addWidget(table_widget)
def table_right_menu(self, pos):
selected_item_list = self.table_widget.selectedItems()
menu = QMenu()
item_copy = menu.addAction("复制")
item_log = menu.addAction("查看日志")
item_log_clear = menu.addAction("清除日志")
# 选中了那个?
action = menu.exec_(self.table_widget.mapToGlobal(pos))
if action == item_copy:
# 赋值当前型号 B08166SLDF
clipboard = QApplication.clipboard() # 复制信息到剪切板
clipboard.setText(selected_item_list[0].text())
if action == item_log:
# 查看日志,在对话框中显示日志信息
# 获取选中的型号
row_index = selected_item_list[0].row()
asin = self.table_widget.item(row_index, 0).text().strip()
dialog = LogDialog(asin)
dialog.setWindowModality(Qt.ApplicationModal)
dialog.exec_()
if action == item_log_clear:
# 清空日志
row_index = selected_item_list[0].row()
asin = self.table_widget.item(row_index, 0).text().strip()
file_path = os.path.join("log", "{}.log".format(asin))
if os.path.exists(file_path):
os.remove(file_path)
更新文本展示信息
label_status = QLabel("xxx")
label_status.setText(message)
label_status.repaint() # 重绘
参考博客: