python pyqt5 QTabWidget实现每个tab独立弹窗QDialog互相不影响,切换tab时自动切换弹窗

功能:

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_())

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值