功能:
1.QTabWidget实现每个tab独立弹窗QDialog互相不影响,切换tab时自动切换弹窗
2.QDialog永远在父控件QTabWidget之上,并在弹窗时可操作QTabWidget
3.关闭弹窗时清除打开列表记录,关闭tab时关闭弹窗并清除打开列表记录,关闭tab未在本文中体现,可参考其他文章
效果图:
代码:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QPushButton, QApplication, QLineEdit, QLabel, QDialog, QTextEdit, QTabWidget, QMainWindow
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.dialogs = {}
self.initUI()
def initUI(self):
# 创建一个 QTabWidget
self.tabWidget = QTabWidget(self)
self.tabWidget.currentChanged.connect(self.tab_changed) # 监听选项卡切换事件
self.tabWidget.tabCloseRequested.connect(self.closeEvent) # 监听选项卡关闭事件
self.setCentralWidget(self.tabWidget)
# 创建多个 QTextEdit 并添加到 QTabWidget 中
for i in range(3):
textEdit = QTextEdit(self.tabWidget)
self.tabWidget.addTab(textEdit, f"文本编辑{i + 1}")
# 创建一个按钮用于显示查找/替换对话框
self.findReplaceButton = QPushButton("查找/替换", self)
self.findReplaceButton.move(10, 600)
self.findReplaceButton.clicked.connect(self.show_dialog)
# 设置主窗口的大小和标题
self.setGeometry(100, 100, 800, 650)
self.setWindowTitle("示例")
def show_dialog(self):
current_tab_index = self.tabWidget.currentIndex()
current_tab_widget = self.tabWidget.currentWidget()
if current_tab_widget:
dialog = self.dialogs.get(id(current_tab_widget))
if not dialog:
dialog = FindReplace(self.tabWidget)
self.dialogs[id(current_tab_widget)] = dialog
dialog.setupUi(self.dialogs)
dialog.show()
def tab_changed(self, index):
for dialog_id, dialog in self.dialogs.items():
if dialog_id != id(self.tabWidget.widget(index)) and dialog.isVisible():
dialog.hide()
elif dialog_id == id(self.tabWidget.widget(index)) and dialog.isHidden():
dialog.show()
def closeEvent(self, event):
ids_to_remove = []
for dialog_id, dialog in self.dialogs.items():
if dialog == self:
ids_to_remove.append(dialog_id)
for dialog_id in ids_to_remove:
del self.dialogs[dialog_id]
event.accept()
class FindReplace(QDialog):
def __init__(self, parent=None):
super(FindReplace, self).__init__(parent)
self.setWindowTitle("查找/替换")
self.setGeometry(0, 0, 250, 200)
#self.setupUi()
def setupUi(self,dialogs):
self.dialogs = dialogs
# 添加查找和替换组件到对话框中
find_label = QLabel("查找:", self)
find_label.move(10, 10)
find_edit = QLineEdit(self)
find_edit.move(70, 10)
replace_label = QLabel("替换:", self)
replace_label.move(10, 40)
replace_edit = QLineEdit(self)
replace_edit.move(70, 40)
find_button = QPushButton("查找", self)
find_button.move(10, 80)
replace_button = QPushButton("替换", self)
replace_button.move(90, 80)
replace_all_button = QPushButton("全部替换", self)
replace_all_button.move(170, 80)
def closeEvent(self, event):
main_window = self.parent()
ids_to_remove = []
for dialog_id, dialog in self.dialogs.items():
if dialog == self:
ids_to_remove.append(dialog_id)
for dialog_id in ids_to_remove:
del self.dialogs[dialog_id]
event.accept()
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())