需求场景:
使用 qt Dialog窗口进行预览文本内容时,发现窗口的右上角只有帮助、关闭按钮,又不想每次通过鼠标改动窗口的大小查看更多的内容。
思路:
修改 Dialog 右上角的按钮为最大化、最小化
实现:
自定义右上角按钮配置:
self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowMaximizeButtonHint)
-
最大化按钮:
QtCore.Qt.WindowMaximizeButtonHint
-
最小化按钮:
QtCore.Qt.WindowMinimizeButtonHint
-
关闭按钮:
QtCore.Qt.WindowCloseButtonHint
-
帮助按钮:
QtCore.Qt.WindowContextHelpButtonHint
附:其他按钮的定义,参考qt库文件文件,
- 创建新的py文件,引入qt库
python from PyQt5.QtCore import Qt
- 按住Ctrl后,鼠标左键点击
Qt
,跳转至Qt.py中即可查看其他可用的按钮
- 创建新的py文件,引入qt库
实现效果:
示例代码
# -*- coding:UTF-8 -*-
"""
@ProjectName : pythonProject
@FileName : browser_win.py
@Description: json文件预览
@Time : 2022/10/17 19:30
@Author : Qredsun
"""
# -*- coding:UTF-8 -*-
from PyQt5 import QtCore
from PyQt5.QtCore import Qt
from loguru import logger
from ui.common import info_box
from util.collect_project_info import convert_str_to_json
from PyQt5 import QtWidgets
from PyQt5.QtCore import pyqtSignal
from PyQt5 import QtCore, QtGui, QtWidgets
# UI
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.setWindowModality(QtCore.Qt.ApplicationModal)
Form.resize(417, 320)
self.gridLayout = QtWidgets.QGridLayout(Form)
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(Form)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.conf_browser = QtWidgets.QTextBrowser(Form)
self.conf_browser.setAutoFormatting(QtWidgets.QTextEdit.AutoAll)
self.conf_browser.setReadOnly(False)
self.conf_browser.setObjectName("conf_browser")
self.gridLayout.addWidget(self.conf_browser, 1, 0, 1, 3)
self.cancel_btn = QtWidgets.QPushButton(Form)
self.cancel_btn.setMaximumSize(QtCore.QSize(130, 16777215))
self.cancel_btn.setObjectName("cancel_btn")
self.gridLayout.addWidget(self.cancel_btn, 2, 1, 1, 1)
self.save_btn = QtWidgets.QPushButton(Form)
self.save_btn.setMaximumSize(QtCore.QSize(130, 16777215))
self.save_btn.setObjectName("save_btn")
self.gridLayout.addWidget(self.save_btn, 2, 2, 1, 1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "配置预览"))
self.label.setText(_translate("Form", "当前配置"))
self.cancel_btn.setText(_translate("Form", "取消"))
self.save_btn.setText(_translate("Form", "保存"))
class Dialog(QtWidgets.QDialog, Ui_Form):
# 自定义信号
output_signal = pyqtSignal(str)
def __init__(self, project_conf, title=None):
super().__init__()
self.setupUi(self)
# 设置窗口右上角的显示按钮
self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowMaximizeButtonHint)
self.content_text = project_conf
self.title = title
self.show_conf()
self.save_btn.setEnabled(False)
# 选择公共配置文件
self.conf_browser.textChanged.connect(lambda: self.save_btn.setEnabled(True))
self.save_btn.clicked.connect(self.save_conf)
self.cancel_btn.clicked.connect(self.close)
# 配置展示
def show_conf(self):
if self.title:
self.setWindowTitle(self.title)
self.conf_browser.setText(self.content_text)
# 配置保存
def save_conf(self):
if self.save_btn.text() == '恢复':
logger.debug('恢复原始文档')
self.show_conf()
self.save_btn.setText('保存')
self.save_btn.setEnabled(False)
return
# 内容格式检查
cur_content_text = self.conf_browser.toPlainText()
if not convert_str_to_json(cur_content_text):
msg = '修改后的内容不符合json格式要求'
info_box(msg, self)
self.save_btn.setText('恢复')
return
# 配置校验 todo 看需求再进行补充
self.content_text = cur_content_text
self.close()
def closeEvent(self, event) -> None:
self.output_signal.emit(self.content_text)
logger.info(f'返回最新的配置')
def keyPressEvent(self, event):
if event.key() == Qt.Key_Escape:
self.close()
import sys
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
text = 'ddddddd'
w = Dialog(text)
w.show()
sys.exit(app.exec_())