Skip to content

Commit 3c2d2dc

Browse files
committed
Add 03-12-01-03
QDialog-槽尺寸拖拽
1 parent 899975e commit 3c2d2dc

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import sys
2+
3+
from PySide6 import QtCore, QtWidgets
4+
5+
"""
6+
QDialog 槽、结果、尺寸拖拽控件
7+
8+
9+
QDialog有一组槽,用于显示、关闭对话框并返回结果:
10+
.accept() 隐藏模态对话框,并将结果码设置为 QDialog.Accepted
11+
.reject() 隐藏模态对话框,并将结果码设置为 QDialog.Rejected,键盘Esc键、直接关闭对话框也会触发
12+
.open() 将对话框作为窗口级模态显示,立即返回
13+
.done(r: int) 关闭对话框并将其结果码设置为r,finished()信号立即发射r。若此对话框以exec()显示,
14+
则done()也将导致局部事件循环结束,且exec()返回r。
15+
.exec() 将对话框作为模态对话框显示。(默认为应用程序级模态)此函数返回QDialog.Accepted或QDialog.Rejected。
16+
尽量避免使用exec()函数,而用open()替代。因为open()是异步的,并且不会增加额外的事件循环
17+
18+
QDialog.result中保存了对话框获得的结果,也可以通过代码显式设置结果码:
19+
.result() -> int 获取模态对话框的结果码,QDialog.Accepted为1,QDialog.Rejected为0
20+
.setResult(i: int) 将模态对话框的结果码设置为i
21+
22+
获取对话框结果码的几种方式:
23+
- .exec() 的返回值,例如 result = my_dialog.exec()
24+
- finished(result: int) 信号传递
25+
- .result() 的返回值
26+
27+
QDialog可以指定是否在窗口右下角显示一个QSizeGrip控件,方便用户将光标置于其上拖拽调整窗口大小
28+
.setSizeGripEnabled(enable: bool) 设置是否使用尺寸拖拽控件(默认为否)
29+
.isSizeGripEnabled() -> bool 获取尺寸拖拽控件启用状态
30+
31+
"""
32+
33+
34+
class MyWidget(QtWidgets.QWidget):
35+
def __init__(self, *args, **kwargs):
36+
super().__init__(*args, **kwargs)
37+
self.setWindowTitle("QDialog-槽")
38+
self.resize(800, 600)
39+
self.dialog = QtWidgets.QDialog(self)
40+
self.setup_ui()
41+
self.setup_dialog()
42+
43+
def setup_ui(self) -> None:
44+
"""设置界面"""
45+
46+
# 用于显示对话框
47+
open_dialog_btn = QtWidgets.QPushButton("打开对话框(Open)", self)
48+
open_dialog_btn.move(200, 200)
49+
open_dialog_btn.clicked.connect(self.dialog.open) # type: ignore
50+
exec_dialog_btn = QtWidgets.QPushButton("打开对话框(Exec)", self)
51+
exec_dialog_btn.move(400, 200)
52+
exec_dialog_btn.clicked.connect(self.dialog.exec) # type: ignore
53+
54+
# 用于显示对话框返回值
55+
info_label = QtWidgets.QLabel(self)
56+
info_label.move(220, 300)
57+
58+
@QtCore.Slot(int)
59+
def show_result(result: int) -> None:
60+
info_label.setText(f"对话框窗口的返回值为:{result}")
61+
info_label.adjustSize()
62+
63+
self.dialog.finished.connect(show_result) # type: ignore
64+
65+
def setup_dialog(self) -> None:
66+
"""设置对话框窗口"""
67+
self.dialog.setWindowTitle("对话框-测试槽功能")
68+
69+
self.dialog.setSizeGripEnabled(True) # 在对话框右下角显示易于拖拽控制窗口尺寸的把手
70+
71+
btn_1 = QtWidgets.QPushButton("Accept")
72+
btn_1.clicked.connect(self.dialog.accept) # type: ignore
73+
74+
btn_2 = QtWidgets.QPushButton("Reject")
75+
btn_2.clicked.connect(self.dialog.reject) # type: ignore
76+
77+
btn_3 = QtWidgets.QPushButton("Done")
78+
spinbox = QtWidgets.QSpinBox()
79+
spinbox.setValue(50)
80+
81+
# 将spinbox中用户设定的值作为对话框结果码返回
82+
btn_3.clicked.connect(lambda: self.dialog.done(spinbox.value())) # type: ignore
83+
84+
# 布局管理器
85+
layout = QtWidgets.QHBoxLayout()
86+
layout.addWidget(btn_1)
87+
layout.addWidget(btn_2)
88+
layout.addWidget(spinbox)
89+
layout.addWidget(btn_3)
90+
self.dialog.setLayout(layout)
91+
92+
93+
if __name__ == "__main__":
94+
app = QtWidgets.QApplication(sys.argv)
95+
window = MyWidget()
96+
window.show()
97+
sys.exit(app.exec())

0 commit comments

Comments
 (0)