如何在不同的 QTabWidget 上显示不同的目录

Posted

技术标签:

【中文标题】如何在不同的 QTabWidget 上显示不同的目录【英文标题】:How to display different directories on different QTabWidget 【发布时间】:2018-05-22 13:20:45 【问题描述】:

我不能运行多个函数来为不同的选项卡设置布局。

在我的代码中,只有最后一个 def 函数运行,即使我交换它们的位置,它仍然是唯一运行的最后一个 def

我尝试添加另一个函数来检查 (def_one),它可以工作,但仍然只有一个(最后一个)选项卡函数运行。

这是我的代码。

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
import os
import shutil


import DiskCleaner_ui


class main(QMainWindow, DiskCleaner_ui.Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)


        systray_icon = QIcon("s.png")
        self.systray = QSystemTrayIcon(systray_icon, self)

        menu = QMenu()
        restore = QAction("Restore", self)
        close = QAction("Close", self)

        menu.addActions([restore, close])
        self.systray.setContextMenu(menu)

        self.systray.show()
        self.systray.showMessage("DC", "Started...", QSystemTrayIcon.Information)

        close.triggered.connect(self.close)

        self.treeView = QTreeView()
        self.fileSystemModel = QFileSystemModel(self.treeView)
        self.fileSystemModel.setReadOnly(False)
        self.root = self.fileSystemModel.setRootPath(r'C:\Users\Black Laptop\Desktop')
        self.treeView.setModel(self.fileSystemModel)
        self.treeView.setRootIndex(self.root)
        self.treeView.setSortingEnabled(True)

        self.Delete_Button = QPushButton("Clear Files")
        self.Delete_Button.setFixedSize(90, 30)

        self.Layout = QVBoxLayout(self)
        self.Layout.addWidget(self.treeView)
        self.Layout.addWidget(self.Delete_Button)

        self.Duplicate() #doesnt run
        self.Unused()    #doesnt run
        self.Temp() #last position : runs (even if i interchange functions between them
        self.one()# to check : runs



    def Temp(self):
        self.Temp_Tab.setLayout(self.Layout)
        self.Delete_Button.clicked.connect(self.Clear_Temp_Files)

    def Duplicate(self):
        self.Duplicate_Tab.setLayout(self.Layout)

    def Unused(self):
        self.UnUsed_Tab.setLayout(self.Layout)

    def one(self):
        print('self.one() works...')


    def closeEvent(self, event):
        reply = QMessageBox.question(self, 'Exit', "Are you sure you want to exit?", QMessageBox.Yes | QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()



    def scan(self):
        if os.listdir(r'C:\Users\Black Laptop\Desktop\Py1') == []:
            self.systray.showMessage("DC", "Empty...", QSystemTrayIcon.Information)
        else:
            return


    def Clear_Temp_Files(self):
        self.scan()
        with os.scandir(r'C:\Users\Black Laptop\Desktop\Py1') as entries:
            for entry in entries:
                if entry.is_file() or entry.is_symlink():
                    os.remove(entry.path)
                    self.systray.showMessage("DC", "Temporary files/folders cleared", QSystemTrayIcon.Information)
                elif entry.is_dir():
                    shutil.rmtree(entry.path)
                    self.systray.showMessage("DC", "Temporary files/folders cleared", QSystemTrayIcon.Information)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    H = main()
    H.show()
    app.exec_()

这里是 DiskCleaner_ui

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'DiskCleaner.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(594, 341)
        #MainWindow.setStyleSheet("background-color: rgb(81, 81, 81);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setStyleSheet("background-color: rgb(189, 189, 189);\n"
"alternate-background-color: rgb(44, 44, 44);\n"
"border-color: rgb(185, 185, 185);")
        self.tabWidget.setTabShape(QtWidgets.QTabWidget.Rounded)
        self.tabWidget.setObjectName("tabWidget")
        self.Temp_Tab = QtWidgets.QWidget()
        self.Temp_Tab.setObjectName("Temp_Tab")
        self.tabWidget.addTab(self.Temp_Tab, "")
        self.Duplicate_Tab = QtWidgets.QWidget()
        self.Duplicate_Tab.setObjectName("Duplicate_Tab")
        self.tabWidget.addTab(self.Duplicate_Tab, "")

        self.UnUsed_Tab = QtWidgets.QWidget()
        self.UnUsed_Tab.setObjectName("UnUsed_Tab")
        self.tabWidget.addTab(self.UnUsed_Tab, "")


        self.verticalLayout.addWidget(self.tabWidget)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Disk Cleaner"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.Temp_Tab), _translate("MainWindow", "Temp Files"))
        self.tabWidget.setTabToolTip(self.tabWidget.indexOf(self.Temp_Tab), _translate("MainWindow", "Temporary files..."))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.Duplicate_Tab), _translate("MainWindow", "Duplicate files"))
        self.tabWidget.setTabToolTip(self.tabWidget.indexOf(self.Duplicate_Tab), _translate("MainWindow", "Duplicate Files..."))

        self.tabWidget.setTabText(self.tabWidget.indexOf(self.UnUsed_Tab), _translate("MainWindow", "UnUsed files"))
        self.tabWidget.setTabToolTip(self.tabWidget.indexOf(self.UnUsed_Tab), _translate("MainWindow", "Unused Files for a peeriod of time..."))

谢谢...

【问题讨论】:

那么我该怎么做...我要为每个选项卡创建不同的布局...吗? 是的....有什么办法吗..? @eyllanesc....请问当应用程序安装在其他系统上时,我如何访问其他计算机上的文件夹...? python中有没有办法...? 【参考方案1】:

我通过为每个选项卡创建新的 FileSystemModel 和 Root 来解决问题

【讨论】:

以上是关于如何在不同的 QTabWidget 上显示不同的目录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QWidget 在 QTabWidget 中包含 QList

如何访问 QTabWidget 不同选项卡中的小部件?

在 Qt 中,如何通过 qss 自定义如下 QTabWidget?

如何在 QTabWidget 上显示多光标?

QTabWidget。如何将一个标签移动到正确的位置?

PyQt5 组件之QTabWidget