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
    评论
好的,我可以回答这个问题。您可以使用QProgressDialog类来创建一个进度对话框,然后将其作为装饰器包装您的函数。以下是一个示例代码: ```python from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtWidgets import QApplication, QWidget, QProgressDialog import time class WorkerThread(QThread): finished = pyqtSignal() def __init__(self, func, *args, **kwargs): super().__init__() self.func = func self.args = args self.kwargs = kwargs def run(self): self.func(*self.args, **self.kwargs) self.finished.emit() def wait_dialog(title, message): def decorator(func): def wrapper(*args, **kwargs): app = QApplication.instance() dialog = QProgressDialog(title, message, 0, 0, parent=app.activeWindow()) dialog.setWindowModality(2) dialog.show() thread = WorkerThread(func, *args, **kwargs) thread.finished.connect(dialog.accept) thread.start() dialog.exec_() return wrapper return decorator @wait_dialog("Please wait", "Function is running...") def my_function(): time.sleep(5) print("Function is done!") if __name__ == '__main__': app = QApplication([]) window = QWidget() window.show() my_function() app.exec_() ``` 在这个示例中,我们定义了一个`WorkerThread`类,它继承自`QThread`,并包含一个`finished`信号。我们还定义了一个`wait_dialog`装饰器,它创建了一个进度对话框,并将其作为装饰器包装的函数的父窗口。在装饰器内部,我们创建了一个`WorkerThread`实例,并将其连接到进度对话框的`accept`槽,以便在函数执行完成后关闭对话框。 最后,我们使用`@wait_dialog`装饰器来装饰我们的函数`my_function`,并在主函数中调用它。当我们运行这个程序,它将显示一个进度对话框,等待函数执行完成,然后关闭对话框并打印出"Function is done!"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值