class FileSystemView(QWidget): def __init__(self, dir_path): super().__init__() appWidth = 800 appHeight = 300 self.setWindowTitle('File System Viewer') self.setGeometry(300, 300, appWidth, appHeight) self.model = QFileSystemModel() self.model.setRootPath(dir_path) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(dirPath)) self.tree.setColumnWidth(200, 250) self.tree.setAlternatingRowColors(True) layout = QVBoxLayout() layout.addWidget(self.tree) btnSelect = QPushButton("SELECT") layout.addWidget(btnSelect) self.setLayout(layout)
def init_ui(self): layout = QHBoxLayout() secondlayout = QVBoxLayout() templist = QTextEdit() maillist = QTreeView() maillist.setRootIsDecorated(False) maillist.setAlternatingRowColors(True) model = self.create_mail_model() maillist.setModel(model) self.add_mail(model, '*****@*****.**', 'Your Github Donation', '03/25/2017 02:05 PM') self.add_mail(model, '*****@*****.**', 'Github Projects', '02/02/2017 03:05 PM') self.add_mail(model, '*****@*****.**', 'Your Phone Bill', '01/01/2017 04:05 PM') tempview = QTextEdit() secondlayout.addWidget(maillist) secondlayout.addWidget(tempview) layout.addWidget(templist) layout.addLayout(secondlayout) self.setLayout(layout) self.show()
def set_tree_view(view: QTreeView): view.setRootIsDecorated(False) view.setAlternatingRowColors(True) view.setSortingEnabled(True) view.sortByColumn(1, Qt.AscendingOrder) view.setContextMenuPolicy(Qt.CustomContextMenu) view.setSelectionMode(QAbstractItemView.ExtendedSelection)
class MethodErrorListWidget(): def __init__(self): self.groupDataTypes = QGroupBox('') self.treeView = QTreeView() self.treeView.setRootIsDecorated(False) self.treeView.setAlternatingRowColors(True) dataLayout = QHBoxLayout() dataLayout.addWidget(self.treeView) self.groupDataTypes.setLayout(dataLayout) self.model = None self.clear() pass def add(self, name, error_number, xml_node=None): item = QStandardItem(error_number) self.model.appendRow([item, QStandardItem(name)]) if xml_node != None: #print(xml_node) item.setData(xml_node, Qt.UserRole + 1) pass return item def clear(self): #self.model.clear() #self.model.setHeaderData(0, Qt.Horizontal, "POSSIBLE-ERROR-REFS") if self.model != None: self.model.clear() self.model = QStandardItemModel(0, 2, None) self.model.setHeaderData(0, Qt.Horizontal, "Error Code") self.model.setHeaderData(1, Qt.Horizontal, "POSSIBLE-ERROR-REFS") self.treeView.setModel(self.model) #self.treeView.setColumnWidth(0, 350) pass
class App(QWidget): FROM, SUBJECT, DATE = range(3) def __init__(self): super().__init__() self.title = 'PyQt5 Treeview Example - pythonspot.com' self.left = 10 self.top = 10 self.width = 640 self.height = 240 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.dataGroupBox = QGroupBox('Inbox') # data view self.dataView = QTreeView() self.dataView.setRootIsDecorated(False) self.dataView.setAlternatingRowColors(True) # data layout 水平 dataLayout = QHBoxLayout() # 添加 data view dataLayout.addWidget(self.dataView) self.dataGroupBox.setLayout(dataLayout) # 创建 model model = self.createMailModel(self) # 为 data view 设置 model self.dataView.setModel(model) # 向 model 中插入数据 self.addMail(model, '*****@*****.**', 'Your Github Donation', '03/25/2017 02:05 PM') self.addMail(model, '*****@*****.**', 'Github Projects', '02/02/2017 03:05 PM') self.addMail(model, '*****@*****.**', 'Your Phone Bill', '01/01/2017 04:05 PM') mainLayout = QVBoxLayout() mainLayout.addWidget(self.dataGroupBox) self.setLayout(mainLayout) self.show() def createMailModel(self, parent): model = QStandardItemModel(0, 3, parent) model.setHeaderData(self.FROM, Qt.Horizontal, 'From') model.setHeaderData(self.SUBJECT, Qt.Horizontal, "Subject") model.setHeaderData(self.DATE, Qt.Horizontal, "Date") return model def addMail(self, model, mailFrom, subject, date): model.insertRow(0) model.setData(model.index(0, self.FROM), mailFrom) model.setData(model.index(0, self.SUBJECT), subject) model.setData(model.index(0, self.DATE), date)
def __init__(self): QWidget.__init__(self, flags=Qt.Widget) self.setWindowTitle("ItemView QTreeView") self.setFixedWidth(310) self.setFixedHeight(200) data = [{ "name": "Mouse Action", "icon": "assets/mouse.png", "objects": [ { "name": "Click", "icon": "assets/network.png", "objects": None }, { "name": "Double Click", "icon": "assets/mail.png", "objects": None }, ] }, { "name": "Keyboard", "icon": "assets/keyboard.png", "objects": [ { "name": "Send Hotkey", "icon": "assets/earth.png", "objects": None }, { "name": "Type", "icon": "assets/folder.png", "objects": None }, ] }] self.layout = QBoxLayout(QBoxLayout.LeftToRight, self) self.setLayout(self.layout) # QTreeView 생성 및 설정 view = QTreeView(self) # QTreeView 스타일시트 설정 view.setStyleSheet(open("./ItemViews_QTreeView_03_style.css").read()) view.setAlternatingRowColors(True) # 라인별 교차색 self.model = Model(data) view.setModel(self.model) self.layout.addWidget(view) # 그림을 띄울 QLabel 생성 self.lb = QLabel() self.lb.setFixedSize(50, 50) self.layout.addWidget(self.lb)
class FileListWidget(QGroupBox): FILENAME, PATH = range(2) def __init__(self, title="Files"): super(QGroupBox, self).__init__(title) self.layout = QVBoxLayout(self) self.dataView = QTreeView() self.dataView.setRootIsDecorated(False) self.dataView.setAlternatingRowColors(True) self.layout.addWidget(self.dataView) model = self.create_file_list_model(self) self.dataView.setModel(model) self.data_dir = None self.loaded_directory_label = QLabel( "Click 'Open' to select a directory.", self) self.layout.addWidget(self.loaded_directory_label) self.btnOpen = QPushButton("Open", self) self.btnOpen.clicked.connect(self.load_data_directory) self.layout.addWidget(self.btnOpen) self.setLayout(self.layout) def load_data_directory(self): d = QFileDialog.getExistingDirectory(self, "Select Directory") self.data_dir = d self.loaded_directory_label.setText(self.data_dir) # Load all encountered files files = [] allowed_extensions = ["jpg", "jpeg", "png"] for ext in allowed_extensions: files.extend(glob.glob(os.path.join(d, "*." + ext))) # Add them all into the file list. for file in files: self.add_file_entry(self.dataView.model(), file) return d def create_file_list_model(self, parent): model = QStandardItemModel(0, 2, parent) model.setHeaderData(self.FILENAME, Qt.Horizontal, "Filename") model.setHeaderData(self.PATH, Qt.Horizontal, "Path") return model def add_file_entry(self, model, path): filename = os.path.basename(path) model.insertRow(0) model.setData(model.index(0, self.FILENAME), filename) model.setData(model.index(0, self.PATH), path)
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.items = [ '呵呵', 'aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't' ] self.init() self.addDock() def init(self): self.text = QTextEdit('主窗口') self.text.setAlignment(Qt.AlignCenter) # self.setCentralWidget(self.text) self.dataView = QTreeView() self.dataView.setRootIsDecorated(False) self.dataView.setAlternatingRowColors(True) self.setCentralWidget(self.dataView) model = self.create_model(self, ['from', 'sub', 'date']) self.dataView.setModel(model) self.add_data(model, [ '*****@*****.**', 'Your Github Donation', '03/25/2017 02:05 PM' ]) self.setGeometry(200, 200, 800, 400) self.setWindowTitle('QDockWidget示例') self.show() def onDockListIndexChanged(self, index): item = self.items[index] self.text.setText(item) def addDock(self): dock1 = QDockWidget('DockWidget') dock1.setFeatures(QDockWidget.DockWidgetFloatable) dock1.setAllowedAreas(Qt.LeftDockWidgetArea) listwidget = QListWidget() listwidget.addItems(self.items) listwidget.currentRowChanged.connect(self.onDockListIndexChanged) dock1.setWidget(listwidget) self.addDockWidget(Qt.LeftDockWidgetArea, dock1) def create_model(self, parent, columns=['column1']): model = QStandardItemModel(0, len(columns), parent) for k, v in enumerate(columns): model.setHeaderData(k, Qt.Horizontal, v) return model def add_data(self, model, data): model.insertRow(0) for k, v in enumerate(data): model.setData(model.index(0, k), v)
class RouteTable(QWidget): NO1, FROM, NO2, TO, CLUSTER = range(5) def __init__(self): super().__init__() # Main layout main_layout = QVBoxLayout() # Sub layout self.cluster_combobox = QComboBox() self.table_container = QGroupBox("Result") # Route Table self.table = QTreeView() self.table.setRootIsDecorated(False) self.table.setAlternatingRowColors(True) self.model = QStandardItemModel(0, 5, self) self.model.setHeaderData(self.NO1, Qt.Horizontal, "No") self.model.setHeaderData(self.FROM, Qt.Horizontal, "From") self.model.setHeaderData(self.NO2, Qt.Horizontal, "No") self.model.setHeaderData(self.TO, Qt.Horizontal, "To") self.model.setHeaderData(self.CLUSTER, Qt.Horizontal, "Cluster number") self.table.setModel(self.model) table_header = self.table.header() table_header.resizeSection(0, 25) table_header.resizeSection(1, 190) table_header.resizeSection(2, 25) table_header.resizeSection(3, 190) table_container_layout = QHBoxLayout() table_container_layout.addWidget(self.table) self.table_container.setLayout(table_container_layout) # Add to main layout main_layout.addWidget(self.cluster_combobox) main_layout.addWidget(self.table_container) self.setLayout(main_layout) def addRoute(self, model, from_no, from_route, to_no, to_route, cluster_number): root = self.table.model() n = root.rowCount() model.insertRow(n) model.setData(model.index(n, self.NO1), from_no) model.setData(model.index(n, self.FROM), from_route) model.setData(model.index(n, self.NO2), to_no) model.setData(model.index(n, self.TO), to_route) model.setData(model.index(n, self.CLUSTER), cluster_number) def clearAllRoute(self): root = self.table.model() root.removeRows(0, root.rowCount())
class App(QWidget): FROM, SUBJECT, DATE, TEST = range(4) def __init__(self): super().__init__() self.title = 'PyQt5 Treeview Example - pythonspot.com' self.left = 200 self.top = 200 self.width = 640 self.height = 240 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.dataGroupBox = QGroupBox("Inbox") self.dataView = QTreeView() self.dataView.setRootIsDecorated(False) self.dataView.setAlternatingRowColors(True) #self.setEditTriggers(QAbstractItemView.NoEditTriggers) dataLayout = QHBoxLayout() dataLayout.addWidget(self.dataView) self.dataGroupBox.setLayout(dataLayout) model = self.createModel(self) self.dataView.setModel(model) self.addItem(model, '*****@*****.**', 'Your Github Donation', '03/25/2017 02:05 PM', "test1") self.addItem(model, '*****@*****.**', 'Github Projects', '02/02/2017 03:05 PM', "test222") self.addItem(model, '*****@*****.**', 'Your Phone Bill', '01/01/2017 04:05 PM', "test3") mainLayout = QVBoxLayout() mainLayout.addWidget(self.dataGroupBox) self.setLayout(mainLayout) self.show() """def createModel(self, parent): model = QStandardItemModel(0, 4, parent) model.setHeaderData(self.FROM, Qt.Horizontal, "From") model.setHeaderData(self.SUBJECT, Qt.Horizontal, "Subject") model.setHeaderData(self.DATE, Qt.Horizontal, "Date") model.setHeaderData(self.TEST, Qt.Horizontal, "Test") return model""" def addItem(self, model, mailFrom, subject, date, test): model.insertRow(0) model.setData(model.index(0, self.FROM), mailFrom) model.setData(model.index(0, self.SUBJECT), subject) model.setData(model.index(0, self.DATE), date) model.setData(model.index(0, self.TEST), test)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._skip_next_hide = False self.setStyleSheet("""QPushButton { text-decoration:underline; border: none;}""") view = QTreeView() view.setUniformRowHeights(True) view.setAlternatingRowColors(True) view.setHeaderHidden(True) view.viewport().installEventFilter(self) self.setView(view)
def __init__(self, *args): super().__init__(*args) self.__skip_next_hide = False tree_view = QTreeView(self) tree_view.setFrameShape(QFrame.NoFrame) tree_view.setEditTriggers(tree_view.NoEditTriggers) tree_view.setAlternatingRowColors(True) tree_view.setSelectionBehavior(tree_view.SelectRows) tree_view.setWordWrap(True) tree_view.setAllColumnsShowFocus(True) tree_view.setHeaderHidden(True) self.setView(tree_view) self.view().viewport().installEventFilter(self)
def __init__(self, parent=None): super(TreeComboBox, self).__init__(parent) self.__skip_next_hide = False self._last_pick = None tree_view = QTreeView(self) tree_view.setFrameShape(QFrame.NoFrame) tree_view.setEditTriggers(tree_view.NoEditTriggers) tree_view.setAlternatingRowColors(True) tree_view.setSelectionBehavior(tree_view.SelectRows) tree_view.setWordWrap(True) tree_view.setAllColumnsShowFocus(True) self.setView(tree_view) self.view().viewport().installEventFilter(self)
class FileBrowser(QWidget): def __init__(self, dirPath): super(FileBrowser, self).__init__() appWidth = 800 appHeight = 800 self.setWindowTitle('File Browser') self.setGeometry(300, 300, appWidth, appHeight) self.model = QFileSystemModel() self.model.setRootPath(dirPath) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(dirPath)) self.tree.setColumnWidth(0, 250) self.tree.setAlternatingRowColors(True) layout = QVBoxLayout() layout.addWidget(self.tree) self.setLayout(layout)
class FileSystemView(QWidget): def __init__(self, dir_path): super().__init__() self.setWindowTitle("Todos los archivos") self.setGeometry(300, 300, 800, 300) self.model = QFileSystemModel() self.model.setRootPath(dir_path) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(dir_path)) self.tree.setColumnWidth(300, 300) self.tree.setAlternatingRowColors(True) layout = QVBoxLayout() layout.addWidget(self.tree) self.setLayout(layout)
class MetadataList(QWidget): def __init__(self, parent=None): super().__init__(parent) self._parent = parent #self.resize(100, 100) #sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) #sizePolicy.setHorizontalStretch(2) #sizePolicy.setVerticalStretch(0) #sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) #self.setSizePolicy(sizePolicy) self.mdataview = QTreeView() self.mdataview.setHeaderHidden(True) self.mdataview.setSortingEnabled(True) self.mdataview.setAlternatingRowColors(True) self.mdataview.setEditTriggers(QAbstractItemView.NoEditTriggers) self.mdataview.sortByColumn(0, Qt.AscendingOrder) # Qt.DescendingOrder model = QStandardItemModel(0, 2) self.mdataview.setModel(model) layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.mdataview) self.setLayout(layout) self.setVisible(True) def setupDataMapper(self, treeview): self._dataMapper = treeview.dataMapper self._dataMapper.setItemDelegate(MetadataDelegate(self)) # self._parent.parent().parent().db self._dataMapper.addMapping(self.mdataview, 1) treeview.selectionModel().currentChanged.connect(self.setSelection) def setSelection(self, current): parent = current.parent() self._dataMapper.setRootIndex(parent) self._dataMapper.setCurrentModelIndex(current) def clearData(self, layout=None): # NOT IMPLEMENTED---------------------------------------------- if hasattr(self, "_dataMapper"): self._dataMapper.clearMapping()
class FileView(QWidget): def __init__(self, dir_path): super().__init__() # Setup Window self.setFixedSize(700, 300) self.setWindowTitle('File Viewer') self.setGeometry(640, 360, 700, 300) self.model = QFileSystemModel() self.model.setRootPath(dir_path) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(dirPath)) self.tree.setColumnWidth(0, 250) self.tree.setAlternatingRowColors(True) # Layout layout = QVBoxLayout() layout.addWidget(self.tree) self.setLayout(layout)
class HistoryWidget(QWidget): def __init__(self, parent=None): super(HistoryWidget, self).__init__(parent=parent) self.historyView = QTreeView(self) self.proxyModel = HistorySortModel(self) self.sourceModel = QStandardItemModel() self.initUI() def initUI(self): self.historyView.setRootIsDecorated(False) self.historyView.setAlternatingRowColors(True) self.historyView.setModel(self.proxyModel) self.historyView.setSortingEnabled(True) self.historyView.sortByColumn(1, Qt.AscendingOrder) self.historyView.setFixedWidth(750) self.sourceModel = QStandardItemModel(0, 6, self) self.sourceModel.setHeaderData(0, Qt.Horizontal, "Model Name") self.sourceModel.setHeaderData(1, Qt.Horizontal, "Algorithm") self.sourceModel.setHeaderData(2, Qt.Horizontal, "Score") self.sourceModel.setHeaderData(3, Qt.Horizontal, "TrainSet") self.sourceModel.setHeaderData(4, Qt.Horizontal, "Running Time") self.sourceModel.setHeaderData(5, Qt.Horizontal, "Param") self.proxyModel.setSourceModel(self.sourceModel) self.historyView.setModel(self.sourceModel) def addItem(self, result: modelResult): self.sourceModel.insertRow(self.sourceModel.rowCount()) self.sourceModel.setData(self.sourceModel.index(0, 0), result.modelName) # string self.sourceModel.setData(self.sourceModel.index(0, 1), result.algorithm) # string self.sourceModel.setData(self.sourceModel.index(0, 2), result.score) # float self.sourceModel.setData(self.sourceModel.index(0, 3), result.trainSet) # string self.sourceModel.setData(self.sourceModel.index(0, 4), result.runTime) # second self.sourceModel.setData(self.sourceModel.index(0, 5), result.param) # dict
def _init_ui(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) group_box = QGroupBox('Inbox'); data_view = QTreeView() data_view.setRootIsDecorated(False) data_view.setAlternatingRowColors(True) data_layout = QHBoxLayout() data_layout.addWidget(data_view) group_box.setLayout(data_layout) model = self._create_mail_model(self) data_view.setModel(model) self._add_mail(model, '*****@*****.**', 'A subject', '01/01/2001') self._add_mail(model, '*****@*****.**', 'B subject', '02/02/2002') self._add_mail(model, '*****@*****.**', 'C subject', '03/03/2003') main_layout = QHBoxLayout() main_layout.addWidget(group_box) self.setLayout(main_layout)
class App(QWidget): FROM, SUBJECT, DATE = range(3) def __init__(self): super.__init__() self.title = 'Treeview Example' self.left = 10 self.top = 30 self.width = 640 self.height = 240 self.init_ui() def init_ui(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.dataGroupBox = QGroupBox("Inbox") self.dataView = QTreeView() self.dataView.setRootIsDecorated(False) self.dataView.setAlternatingRowColors(True)
class CodeInspector(QWidget): def __init__(self, parent): QWidget.__init__(self, parent) self.parent = parent root_size = self.parent.size() w = root_size.width() #h = root_size.height() self.setMaximumWidth(250) hbox = QVBoxLayout(self) self.setLayout(hbox) scroll = QScrollArea(self) scroll.setAlignment(Qt.AlignLeft | Qt.AlignTop) scroll.setWidgetResizable(True) self.treeView = QTreeView(self) self.treeView.setAlternatingRowColors(True) model = self.createModel() self.treeView.setModel(model) toolbar = QToolBar(self) scroll.setWidget(self.treeView) hbox.addWidget(scroll) hbox.addWidget(toolbar) model.insertRow(0) model.setData(model.index(0, 0), 0) model.setData(model.index(0, 1), 'un icono') model.setData(model.index(0, 2), 'una definición') def createModel(self): model = QStandardItemModel(0, 3, self.treeView) model.setHeaderData(0, Qt.Horizontal, "id") model.setHeaderData(1, Qt.Horizontal, "icon") model.setHeaderData(2, Qt.Horizontal, "def") return model
class FileSystemView(QWidget): def __init__(self, dir_path): super().__init__() appWidth = 800 appHeight = 300 self.setWindowTitle('File System Viewer') self.setGeometry(300, 300, appWidth, appHeight) self.model = QFileSystemModel() self.model.setRootPath(dir_path) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(dirPath)) self.tree.setColumnWidth(0, 250) self.tree.setAlternatingRowColors(True) layout = QVBoxLayout() self.photo = QLabel('Hola' + chr(10) + 'Caracola') layout.addWidget(self.tree) layout.addWidget(self.photo) self.setLayout(layout) self.tree.selectionModel().selectionChanged.connect(self.select) def keyPressEvent(self, event): if event.key() == Qt.Key_Space or event.key() == Qt.Key_Return: index = self.tree.selectedIndexes()[0] crawler = index.model().filePath(index) print(crawler) #self.tree.keyPressEvent(self, event) def select(self, index1): index = self.tree.selectedIndexes()[0] file_sel = index.model().filePath(index) if os.path.isfile(file_sel) and file_sel[-3:].upper() in 'JPG PNG': pixmap = QPixmap(file_sel) self.photo.setPixmap(pixmap) print(file_sel)
class FileSystemView(QWidget): def __init__(self, dir_path): super().__init__() #TITULO Y DIMENSIONES DE LA VENTANA. self.setWindowTitle('File System Viewer') self.setGeometry(300, 300, 800, 300) #DEFINIR DIRECTORIO. self.model = QFileSystemModel() self.model.setRootPath(dir_path) #GENERAR VISTA DE ARCHIVOS Y CARPETAS. self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(dirPath)) self.tree.setColumnWidth(200,250) self.tree.setAlternatingRowColors(True) #MOSTRAR VENTANA CON LAS VISTA. layout = QVBoxLayout() layout.addWidget(self.tree) self.setLayout(layout)
class Explorer(QDialog): def __init__(self, parent, window_title=_("Select resources"), subtitle=_("Select files and/or folders to include")): super().__init__(parent) self.logger = logging.getLogger(__name__) self.setModal(True) self.setSizeGripEnabled(True) self.setWindowTitle(window_title) self.subtitle = subtitle self.file_set = set() self.config = Configuration() self.__init_ui__() self.filename_filter = FilenameFilter() #self.show() def __init_ui__(self): # layout vert = QVBoxLayout(self) vert.setContentsMargins(0, 0, 0, 0) resource_dir = self.config.cfg_resource_dir() p_top = QVBoxLayout() lb_subtitle = QLabel(self.subtitle) lb_subtitle.setContentsMargins(10, 10, 10, 0) p_top.addWidget(lb_subtitle) self.model = QFileSystemModel() self.model.setRootPath(resource_dir) self.view = QTreeView() self.view.setModel(self.model) self.view.setRootIndex(self.model.index(self.model.rootPath())) self.view.setAlternatingRowColors(True) self.view.setSelectionMode(QAbstractItemView.MultiSelection) self.view.selectionModel().selectionChanged.connect( self.selection_changed) self.view.collapsed.connect(self.item_collapsed) self.view.expanded.connect(self.item_expanded) p_top.addWidget(self.view) p_info = QHBoxLayout() lb_resource = QLabel(_("resource dir") + ": " + resource_dir) lb_resource.setContentsMargins(10, 0, 10, 0) self.lb_selection_count = QLabel( str(self.selected_file_count()) + " " + _("resources selected")) self.lb_selection_count.setContentsMargins(10, 0, 10, 0) p_info.addWidget(self.lb_selection_count) p_info.addStretch(1) p_info.addWidget(lb_resource) p_top.addLayout(p_info) p_bottom = QHBoxLayout() self.pb_deselect = QPushButton(_("Deselect all")) self.pb_deselect.clicked.connect(self.pb_deselect_clicked) self.pb_deselect.setEnabled(self.selected_file_count() > 0) p_bottom.addWidget(self.pb_deselect) p_bottom.addStretch(1) self.pb_ok = QPushButton(_("OK")) self.pb_ok.setAutoDefault(True) self.pb_ok.clicked.connect(self.accept) p_bottom.addWidget(self.pb_ok) pb_cancel = QPushButton(_("Cancel")) pb_cancel.clicked.connect(self.reject) p_bottom.addWidget(pb_cancel) vert.addLayout(p_top) vert.addLayout(p_bottom) self.setLayout(vert) self.resize(self.config.explorer_width(), self.config.explorer_height()) width = self.view.width() - 50 self.view.setColumnWidth(0, width / 2) self.view.setColumnWidth(1, width / 6) self.view.setColumnWidth(2, width / 6) self.view.setColumnWidth(3, width / 6) def __persist__(self): # persist properties of the explorer self.config.set_explorer_width(self.width()) self.config.set_explorer_height(self.height()) self.config.persist() def __compute_filenames__(self, item_selection): # item_selection: a QItemSelection # return corresponding absolute filenames as a set, including filenames in underlying folders s = set() for index in item_selection.indexes(): # we have an index for each column in the model if index.column() == 0: path = index.model().filePath(index) if os.path.isdir(path): for root, directories, filenames in os.walk(path): for filename in filenames: if self.filename_filter.accept(filename): s.add(os.path.join(root, filename)) elif os.path.isfile(path): s.add(path) else: self.logger.warn("isUnknownThing", path) return s def showEvent(self, QShowEvent): #self.pb_ok.setFocus() pass def set_filename_filter(self, filename_filter): # set the FilenameFilter self.filename_filter = filename_filter def selected_file_count(self): return len(self.file_set) def selected_file_set(self): return frozenset(self.file_set) def selection_changed(self, selected, deselected): # selected, deselected: PyQt5.QtCore.QItemSelection selected_filenames = self.__compute_filenames__(selected) self.file_set.update(selected_filenames) deselected_filenames = self.__compute_filenames__(deselected) self.file_set.difference_update(deselected_filenames) self.pb_deselect.setEnabled(self.selected_file_count() > 0) self.lb_selection_count.setText( str(self.selected_file_count()) + " " + _("resources selected")) def item_expanded(self, index): # index: a QModelIndex # show all child items selected/deselected in accordance with state of parent folder pass def item_collapsed(self, index): pass def pb_deselect_clicked(self): self.view.selectionModel().clear() def hideEvent(self, QHideEvent): self.__persist__()
class PYCFScape(QMainWindow): def __init__(self): super().__init__() self.VPK = None self.VPKDir = '' self.ExportItems = [] self.OptionsMenu = options.PYCFScapeOptionsWindow(app) self.Setup() def LoadVPK(self, file): print('Opening {}'.format(file)) self.DirectoryModel.clear() self.ExportItems = [] self.VPK = None try: self.VPK = vpk.open(file) except FileNotFoundError as E: self.ErrorBox(str(E), 'File Doesn\'t Exist.') return except ValueError as E: self.ErrorBox(str(E)) return self.VPKDir = file self.HandleVPK(self.VPK) def ExportVPKFiles(self): print('Exporting files from {}'.format('VPK')) for Item in self.ExportItems: self.ExportFile(Item.PathInfo) def ExportFile(self, file): outputdir = self.OptionsMenu.Options['config']['path'] if not os.path.isdir('{}{}'.format(outputdir, '/'.join( file.split('/')[:-1]))): print("path {} doesn't exist.".format(file)) os.makedirs('{}{}'.format(outputdir, '/'.join(file.split('/')[:-1]))) print(file) outFile = open('{}{}'.format(outputdir, file[1:]), 'wb') #WB - Write, Bytes pakLines = self.VPK.get_file(file[1:]).read() outFile.write(pakLines) outFile.close() def OpenVPK(self): File = self.OpenDialog('Open VPK', 'Valve Pack Files (*.vpk)') if not File == '': self.LoadVPK(File) def Setup(self): #Winow Information & Such self.setWindowTitle('PYCFScape') self.setMinimumSize(QSize(750, 500)) self.setWindowIcon(QIcon('./res/Icon64.ico')) #Setup Content Layout & Container self.Content = QGroupBox() self.ContentLayout = QGridLayout() #Setup UI Elements self.DirectoryList = QTreeView() self.DirectoryList.setAlternatingRowColors(True) self.ContentLayout.addWidget(self.DirectoryList, 0, 0) self.DirectoryModel = QStandardItemModel(self.DirectoryList) self.DirectoryList.setModel(self.DirectoryModel) #Setup Actions self.OpenAction = QAction('&Open...', self) self.OpenAction.setShortcut('Ctrl+O') self.OpenAction.setStatusTip('Open VPK') self.OpenAction.triggered.connect(self.OpenVPK) self.ExportAction = QAction('&Export...', self) self.ExportAction.setShortcut('Ctrl+E') self.ExportAction.setStatusTip('Export Chosen Files') self.ExportAction.triggered.connect(self.ExportVPKFiles) self.OptionsAction = QAction("&Config") self.OptionsAction.setStatusTip('Change some things') self.OptionsAction.triggered.connect(self.OptionsMenu.show) self.Menu = self.menuBar() self.FileMenu = self.Menu.addMenu('&File') self.FileMenu.addAction(self.OpenAction) self.FileMenu.addAction(self.ExportAction) self.EditMenu = self.Menu.addMenu('&Edit') self.EditMenu.addAction(self.OptionsAction) #Sort out Layout placements and such. self.Content.setLayout(self.ContentLayout) self.setCentralWidget(self.Content) self.DirectoryModel.itemChanged.connect(self.VPKItemClicked) #Show ourselves self.show() def HandleVPK(self, paths): dictPaths = pathtodir.get_path_dict(paths) self.DirectoryMagic(dictPaths) def VPKItemClicked(self, item): #print(item.parent()) if item.VPKItemType == 'File': if item.checkState(): self.ExportItems.append(item) else: self.ExportItems.remove(item) elif item.VPKItemType == 'Dir': if item.checkState(): for Item in item.VPKChildren: Item.setCheckState(2) self.ExportItems.append(Item) item.setCheckState(2) else: for Item in item.VPKChildren: Item.setCheckState(0) self.ExportItems.remove(Item) def DirectoryMagic(self, path, parent=None, wPath=''): #A Magic function that uses R E C U R S I O N! for thing in path: wwPath = wPath + '/{}'.format(thing) #Create our Item variable thingItem = VPKItem(wwPath) thingItem.setText(thing) thingItem.setEditable(False) #thingItem.setIcon(QIcon.fromTheme('document')) thingItem.setCheckable(True) if type(path[thing] ) == dict: #If it's a dictionary, it's a folder. thingItem.setIcon(QIcon.fromTheme('folder-new')) self.DirectoryMagic(path[thing], thingItem, wwPath) thingItem.setType('Dir') else: thingItem.setType('File') if not parent: self.DirectoryModel.appendRow(thingItem) else: parent.appendRow(thingItem) def AddFile(self, filePath): path, file = os.path.split(filePath) pathFolders = path.split('/') Magic(filePath) def ErrorBox(self, text="Message..", title="Error"): box = QMessageBox() box.setIcon(QMessageBox.Critical) box.setText(text) box.setWindowTitle(title) box.setStandardButtons(QMessageBox.Ok) return box.exec() def OpenDialog(self, title="Open File", files="All Files (*)"): options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog filename, _ = QFileDialog.getOpenFileName(self, title, "", files, options=options) return filename
self.setHeaderData(self.SUBJECT, Qt.Horizontal, "Subject") self.setHeaderData(self.DATE, Qt.Horizontal, "Date") def addMail(self, mail_from, subject, date): self.insertRow(0) self.setData(self.index(0, self.FROM), mail_from) self.setData(self.index(0, self.SUBJECT), subject) self.setData(self.index(0, self.DATE), date) if __name__ == '__main__': app = QApplication(sys.argv) dataView = QTreeView() dataView.setRootIsDecorated(False) dataView.setAlternatingRowColors(True) model = MyModel() # Add data model.addMail('*****@*****.**', 'Your Github Donation', '03/25/2017 02:05 PM') model.addMail('*****@*****.**', 'Github Projects', '02/02/2017 03:05 PM') model.addMail('*****@*****.**', 'Your Phone Bill', '01/01/2017 04:05 PM') dataView.setModel(model) dataView.show() # The mainloop of the application. The event handling starts from this point. # The exec_() method has an underscore. It is because the exec is a Python keyword. And thus, exec_() was used instead. exit_code = app.exec_()
class App(QWidget): Country, IPAddress, SessionName, Status, OS, CPU, CPU_Core, RAM, PING = range( 0, 9) def __init__(self): super().__init__() #=========== Main GUI block ================== # Main Window Setting self.title = 'COINPAIGN: Remote Administration Tool' self.setWindowIcon(QIcon('logo.ico')) self.left = 500 self.top = 250 self.width = 1000 self.height = 500 # Getting subnet, LAN and WAN host = self.get_Host_name_IP() self.local = host[0] self.subnet_mask = host[1] self.initUI() self.displayItem() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.dataGroupBox = QGroupBox() self.dataView = QTreeView() # self.dataView.move(0,100) # self.dataView.resize(500, 500) self.dataView.setRootIsDecorated(False) self.dataView.setAlternatingRowColors(True) self.dataView.setSortingEnabled(True) dataLayout = QVBoxLayout() dataLayout.addWidget(self.dataView) self.dataGroupBox.setLayout(dataLayout) mainLayout = QVBoxLayout() mainLayout.addWidget(self.dataGroupBox) self.setLayout(mainLayout) self.dataView.setContextMenuPolicy(Qt.CustomContextMenu) self.dataView.customContextMenuRequested.connect(self.openMenu) # Layout "Refresh" button button = QPushButton('Refresh', self) button.move(900, 5) button.resize(80, 20) button.clicked.connect(self.execute_Refresh) # Layout "IP Lookup" button button = QPushButton('IP Lookup', self) button.move(15, 5) button.resize(80, 20) button.clicked.connect(self.execute_IPlookup) # Layout "MAC Vendor" button button = QPushButton('MAC Vendor', self) button.move(110, 5) button.resize(80, 20) button.clicked.connect(self.execute_MACvendor) def createMailModel( self, parent=None ): #--- create information table view of remote computer model = QStandardItemModel(0, 9, parent) model.setHeaderData(self.Country, Qt.Horizontal, "Country/City ") model.setHeaderData(self.IPAddress, Qt.Horizontal, "IP LAN/WAN") model.setHeaderData(self.SessionName, Qt.Horizontal, "SessionName") model.setHeaderData(self.Status, Qt.Horizontal, "Status") model.setHeaderData(self.OS, Qt.Horizontal, "OS") model.setHeaderData(self.CPU, Qt.Horizontal, "CPU") model.setHeaderData(self.CPU_Core, Qt.Horizontal, "CPU Core") model.setHeaderData(self.RAM, Qt.Horizontal, "RAM(GB)") model.setHeaderData(self.PING, Qt.Horizontal, "PING(ms)") return model #=========== Get and dislay information of remote computers block ================== def displayItem( self ): #--- get and display information of remote computer when applictoin start progressBar.setMaximum(254) #--- get information of remote computer for i in range(1, 254): host = self.subnet_mask + ".%d" % i data = AgentClient.client_program( host) #--- get data from Agentclient module if data != "0": pi = self.get_pingtime(host) data = data + ":" + str(pi) serverdata.append(data) progressBar.setValue(i) t = time.time() while time.time() < t + 0.1: app.processEvents() #--- display information of remote computer self.onReload() splash.hide() self.show() def get_pingtime(self, host): #--- get ping time of live computer ping = subprocess.Popen(["ping", "-n", "1", host], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, error = ping.communicate() out = str(out).replace("\\r\\n", "") temp = out.split("ms") temp1 = temp[3] temp2 = temp1.split(" ") result = temp2[3] return result def onReload(self): #--- display information of remote computer self.model = self.createMailModel(self) self.dataView.setModel(self.model) for data in serverdata: itemData = data.split(":") cn = pycountry.countries.get(alpha_2=itemData[0]) countryname = cn.name amount = int(itemData[8]) GB = round(amount / int(1024 * 1024 * 1024), 2) self.addMail(self.model, './images/' + itemData[0].lower() + '/30.png', countryname + "/" + itemData[1], itemData[2], itemData[3], itemData[4], './icons/' + itemData[5] + '.png', itemData[5], itemData[6], itemData[7], str(GB), itemData[9]) def addMail(self, model, nflag, country, ipaddress, ss_name, status, os_logo, os, cpu, cpu_core, ram, ping): icon = QIcon() icon.addPixmap(QPixmap(nflag)) logo = QIcon() logo.addPixmap(QPixmap(os_logo)) item_col_0 = QStandardItem(icon, country) item_col_1 = QStandardItem(ipaddress) item_col_2 = QStandardItem(ss_name) item_col_3 = QStandardItem(status) item_col_4 = QStandardItem(logo, os) item_col_5 = QStandardItem(cpu) item_col_6 = QStandardItem(cpu_core) item_col_7 = QStandardItem(ram) item_col_8 = QStandardItem(ping) model.appendRow([ item_col_0, item_col_1, item_col_2, item_col_3, item_col_4, item_col_5, item_col_6, item_col_7, item_col_8 ]) #=========== Refresh button process block ================== def execute_Refresh(self): splash.show() progressBar.setMaximum(255) new_serverdata = [] for i in range(1, 254): host = self.subnet_mask + ".%d" % i data = AgentClient.client_program( host ) #--- get information of remote computer from AgentClient module again if data != "0": pi = self.get_pingtime(host) data = data + ":" + str(pi) new_serverdata.append(data) progressBar.setValue(i) t = time.time() while time.time() < t + 0.1: app.processEvents() for old_item in serverdata: #--- update new data k = 0 for new_item in new_serverdata: old1 = old_item.split(":") oldip = old1[2] new1 = new_item.split(":") newip = new1[2] if oldip == newip: break k = k + 1 if k == len(new_serverdata): item = old_item.replace("Connected", "Disconnected") new_serverdata.append(item) serverdata.clear() for i in range(0, len(new_serverdata)): serverdata.append(new_serverdata[i]) self.onReload() #--- display new data on GUI splash.hide() self.show() #=========== IP lookup button process block ================== def execute_IPlookup(self): #---- IP lookup Diaglog GUI dlgEdit = QDialog() dlgEdit.setWindowTitle("IP Lookup") dlgEdit.setWindowIcon(QIcon("./icons/iplookup.png")) dlgEdit.resize(600, 300) # getservIP GUI ( get IP from domain address) self.dnsName = QLabel(dlgEdit) self.dnsName.setText("Target WebSite Domain") self.dnsName.move(20, 12) self.tagDns = QLineEdit(dlgEdit) self.tagDns.setPlaceholderText('google.com') self.tagDns.setReadOnly(False) self.tagDns.setEnabled(True) self.tagDns.move(20, 30) self.tagDns.resize(170, 25) Subm1 = QPushButton('Submit', dlgEdit) Subm1.resize(80, 25) Subm1.move(200, 30) Subm1.clicked.connect(self.submit1_click) self.ipValue = QTextEdit(dlgEdit) self.ipValue.move(0, 60) self.ipValue.resize(300, 240) # Whois GUI ( get informaion corresponding to IP) self.ipAdrr = QLabel(dlgEdit) self.ipAdrr.setText("Target IP Address") self.ipAdrr.move(320, 12) self.tagIP = QLineEdit(dlgEdit) self.tagIP.setPlaceholderText('216.58.200.46') ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" # IP addres validation ( regular expression ) ipRegex = QRegExp("^" + ipRange + "\\." + ipRange + "\\." + ipRange + "\\." + ipRange + "$") ipValidator = QRegExpValidator(ipRegex, self) self.tagIP.setValidator(ipValidator) self.tagIP.setReadOnly(False) self.tagIP.setEnabled(True) self.tagIP.move(320, 30) self.tagIP.resize(170, 25) Subm2 = QPushButton('Submit', dlgEdit) Subm2.resize(80, 25) Subm2.move(500, 30) Subm2.clicked.connect(self.submit2_click) self.ipInfo = QTextEdit(dlgEdit) self.ipInfo.move(300, 60) self.ipInfo.resize(300, 240) dlgEdit.exec_() def submit1_click(self): #--- getservIP processing tagDns = "" tagDns = self.tagDns.text() #--- get domain address from LineEdit() # type website domain address if tagDns == "": msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowTitle("Warning") msg.setText("Please type website domain.") msg.exec_() else: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) ipResult = IP_Lookup.func_getservip( tagDns) #--- get IP from IP_Lookup module self.ipValue.append(" " + ipResult) self.ipValue.append("") QApplication.restoreOverrideCursor() def submit2_click(self): #--- whois processing tagIP = "" tagIP = self.tagIP.text() #--- get ip from LineEdit() # IP validation numItem = tagIP.split(".") if len(numItem) != 4 or tagIP == "": msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowTitle("Warning") msg.setText("Please type IP address.") msg.exec_() elif numItem[3] == "": msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowTitle("Warning") msg.setText("Please type IP address.") msg.exec_() else: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) self.ipInfo.append("Detail Information on " + tagIP) getResult = IP_Lookup.func_whois( tagIP) # get information from IP_Lookup module if getResult == []: self.ipInfo.append(" No result.") else: self.ipInfo.append(" " + "IP:" + "\t " + getResult[0]) self.ipInfo.append(" " + "City:" + "\t " + getResult[1]) self.ipInfo.append(" " + "Region:" + "\t " + getResult[2]) self.ipInfo.append(" " + "Country:" + "\t " + getResult[3]) self.ipInfo.append(" " + "Location:" + "\t " + getResult[4]) self.ipInfo.append(" " + "Postal:" + "\t " + getResult[5]) self.ipInfo.append("") QApplication.restoreOverrideCursor() #=========== MAC Vendor button process block ================== def execute_MACvendor(self): #--- MAC Vendor GUI dlgEdit = QDialog() dlgEdit.setWindowTitle("Mac Vendor") dlgEdit.setWindowIcon(QIcon("./icons/default.png")) dlgEdit.resize(600, 300) self.ipName = QLabel(dlgEdit) self.ipName.setText("MAC Address:") self.ipName.move(20, 25) self.mac = QLineEdit(dlgEdit) self.mac.setPlaceholderText('30-B4-9E-F1-C1-A5') self.mac.setReadOnly(False) self.mac.setEnabled(True) self.mac.move(100, 20) self.mac.resize(170, 25) self.efName = QTextEdit(dlgEdit) self.efName.move(0, 50) self.efName.resize(600, 250) Scan = QPushButton('Submit', dlgEdit) Scan.resize(80, 25) Scan.move(500, 20) Scan.clicked.connect(self.macvendor_click) dlgEdit.exec_() def macvendor_click(self): #--- mac vendor processing mac = "" mac = self.mac.text() #--- get mac from LineEdit() # mac validation if len(mac) < 6 or mac == "": msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowTitle("Warning") msg.setText("Please type MAC address.") msg.exec_() else: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) self.efName.append("Vendor Information on " + mac) vendorInfo = Mac_Vendor.getMacVendor( mac) #--- get vendor informaion from Mac_Vendor module strven = str(vendorInfo) errcheck = strven.split(":") print(errcheck) if errcheck[0] == "{'error'": self.efName.append(" Incorrect MAC address.") else: self.efName.append(" Address:" + "\t " + vendorInfo['address']) self.efName.append("") self.efName.append(" Company:" + "\t " + vendorInfo['company']) self.efName.append(" Country:" + "\t " + vendorInfo['country']) self.efName.append(" End_Hex:" + "\t " + vendorInfo['end_hex']) self.efName.append(" Mac_Prefix:" + "\t " + vendorInfo['mac_prefix']) self.efName.append(" Start_Hex:" + "\t " + vendorInfo['start_hex']) self.efName.append(" Type:" + "\t " + vendorInfo['type']) self.efName.append("") QApplication.restoreOverrideCursor() #=========== PopUP Menu process block ================== def openMenu(self, position): #--- popup menu main GUI menu = QMenu() ipscanItem = QAction(QIcon("./icons/IPScan.png"), "&IPScan", self) menu.addAction(ipscanItem) ipscanItem.triggered.connect( self.execute_ipscan) #--- click ipscan menu portscanItem = QAction(QIcon("./icons/PortScan.png"), "&PortScan", self) menu.addAction(portscanItem) portscanItem.triggered.connect( self.execute_portscan) #--- click port scan menu reverseItem = QAction(QIcon("./icons/ReverseShell.png"), "&ReverseShell", self) menu.addAction(reverseItem) reverseItem.triggered.connect( self.execute_reverse_shell) #--- click reverse shell menu remoteItem = QAction(QIcon("./icons/RemoteDesktop.png"), "&RemoteDesktop", self) menu.addAction(remoteItem) remoteItem.triggered.connect( self.execute_RDC) #--- click remote desktop menu menu.exec_(self.dataView.viewport().mapToGlobal(position)) #------- ip scan procee block --------- def execute_ipscan(self): # ip scan diaglog GUI dlgEdit = QDialog() dlgEdit.setWindowTitle("IP Scan") dlgEdit.setWindowIcon(QIcon("./icons/IPScan.png")) dlgEdit.resize(600, 300) self.ipName = QLabel(dlgEdit) self.ipName.setText("Subnet: ") self.ipName.move(20, 25) self.ips = QLineEdit(dlgEdit) self.ips.setPlaceholderText('192.168.1.0/24') ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" # ips validation ( regular expression ) ipRegex = QRegExp("^" + ipRange + "\\." + ipRange + "\\." + ipRange + "\\." + ipRange + "\\/" + ipRange + "$") ipValidator = QRegExpValidator(ipRegex, self) self.ips.setValidator(ipValidator) self.ips.setReadOnly(False) self.ips.setEnabled(True) self.ips.move(70, 20) self.ips.resize(170, 25) self.comments = QLabel(dlgEdit) self.comments.setText("Ex: 192.168.1.0/24") self.comments.move(245, 25) self.efName = QTextEdit(dlgEdit) self.efName.move(0, 50) self.efName.resize(600, 250) Scan = QPushButton('Scan', dlgEdit) Scan.resize(80, 25) Scan.move(500, 20) Scan.clicked.connect(self.ipscan_click) # call ip scan process dlgEdit.exec_() def ipscan_click(self): #--- ip scan process ips = "" ips = self.ips.text() #--- get ips from LineEdit() #--- ips validation numItem = ips.split(".") if len(numItem) != 4 or ips == "": msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowTitle("Warning") msg.setText("Please type correct subnet...") msg.exec_() elif numItem[3] == "": msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowTitle("Warning") msg.setText("Please type correct subnet...") msg.exec_() # display ip scan result else: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) self.efName.append("IP Address and MAC on " + ips) devices = IP_Scan.arp( str(ips)) #--- ip scan process from IP_Scan module rcv = str(devices) print(rcv) ans = rcv.split(":") if ans[5] == "0>": self.efName.append(" No result.") else: for snd, rcv in devices: self.efName.append(" " + rcv.psrc + "\t" + ": " + rcv.src) self.efName.append("") QApplication.restoreOverrideCursor() #------- port scan procee block --------- def execute_portscan(self): #--- GUI-dialog for port scan dlgEdit = QDialog() dlgEdit.setWindowTitle("Port Scan") dlgEdit.setWindowIcon(QIcon("./icons/PortScan.png")) dlgEdit.resize(600, 300) self.ipName = QLabel(dlgEdit) self.ipName.setText("Host IP:") self.ipName.move(20, 25) self.hostip = QLineEdit(dlgEdit) self.hostip.setPlaceholderText('192.168.1.131') ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" # Part of the regular expression ipRegex = QRegExp("^" + ipRange + "\\." + ipRange + "\\." + ipRange + "\\." + ipRange + "$") ipValidator = QRegExpValidator(ipRegex, self) self.hostip.setValidator(ipValidator) self.hostip.setReadOnly(False) self.hostip.setEnabled(True) self.hostip.move(70, 20) self.hostip.resize(170, 25) self.efName = QTextEdit(dlgEdit) self.efName.move(0, 50) self.efName.resize(600, 250) Scan = QPushButton('Scan', dlgEdit) Scan.resize(80, 25) Scan.move(500, 20) Scan.clicked.connect(self.portscan_click) #--- call port scan process dlgEdit.exec_() def portscan_click(self): #--- port scan process shost = "" shost = self.hostip.text() #--- get host ip from GUI LineEdit() #--- IP address validation processing numItem = shost.split(".") if len(numItem) != 4 or shost == "": msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowTitle("Warning") msg.setText("Please type correct host IP.") msg.exec_() elif numItem[3] == "": msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowTitle("Warning") msg.setText("Please type correct host IP.") msg.exec_() #---- get open port and display else: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) self.efName.append("Open Ports on " + shost) port = "" openPorts = Port_Scan.port_scan( str(shost)) #--- call function of Port_Scan module if openPorts == []: self.efName.append(" No result.") else: for i in openPorts: port = port + " " + i self.efName.append(" " + port) self.efName.append("") QApplication.restoreOverrideCursor() #========== reverse shell processing block ================ def execute_reverse_shell(self): #--- run reverse shell program window_command = "cmd.exe /c start cmd.exe /k python Reverse_Shell.py" Popen(window_command) #========== remote desktop connection block ================ def execute_RDC(self): #--- run remote desktop client program window_command = "python RDC_Client.py" Popen(window_command) # Function to get Local IP address # def get_Host_name_IP(self): # interfaces = netifaces.interfaces() # gws=netifaces.gateways() # ss = gws['default'] # dd = ss[2] # aa = dd[0].split('.') # subnet = aa[0]+"."+aa[1]+"."+aa[2] # UserIP = [] # ii = 0 # for i in interfaces: # if i == 'lo': # continue # iface = netifaces.ifaddresses(i).get(netifaces.AF_INET) # if iface != None: # for j in iface: # UserIP.append(j['addr']) # ii = ii+1 # for ip in UserIP: # sub = ip.split(".") # subip = sub[0]+"."+sub[1]+"."+sub[2] # if subip == subnet: # lan = ip # # array = [lan, subnet, wan] # array = [lan, subnet] # return array def get_Host_name_IP( self): #--- get IP address and subnet of host(this computer) hostname = socket.gethostname() host = socket.gethostbyname(hostname) print(host) sub = host.split(".") subnet = sub[0] + "." + sub[1] + "." + sub[2] array = [host, subnet] return array
class Explorer(QDialog): def __init__( self, parent, window_title=_("Select resources"), subtitle=_("Select files and/or folders to include") ): super().__init__(parent) self.logger = logging.getLogger(__name__) self.setModal(True) self.setSizeGripEnabled(True) self.setWindowTitle(window_title) self.subtitle = subtitle self.file_set = set() self.config = Configuration() self.__init_ui__() self.filename_filter = FilenameFilter() # self.show() def __init_ui__(self): # layout vert = QVBoxLayout(self) vert.setContentsMargins(0, 0, 0, 0) resource_dir = self.config.cfg_resource_dir() p_top = QVBoxLayout() lb_subtitle = QLabel(self.subtitle) lb_subtitle.setContentsMargins(10, 10, 10, 0) p_top.addWidget(lb_subtitle) self.model = QFileSystemModel() self.model.setRootPath(resource_dir) self.view = QTreeView() self.view.setModel(self.model) self.view.setRootIndex(self.model.index(self.model.rootPath())) self.view.setAlternatingRowColors(True) self.view.setSelectionMode(QAbstractItemView.MultiSelection) self.view.selectionModel().selectionChanged.connect(self.selection_changed) self.view.collapsed.connect(self.item_collapsed) self.view.expanded.connect(self.item_expanded) p_top.addWidget(self.view) p_info = QHBoxLayout() lb_resource = QLabel(_("resource dir") + ": " + resource_dir) lb_resource.setContentsMargins(10, 0, 10, 0) self.lb_selection_count = QLabel(str(self.selected_file_count()) + " " + _("resources selected")) self.lb_selection_count.setContentsMargins(10, 0, 10, 0) p_info.addWidget(self.lb_selection_count) p_info.addStretch(1) p_info.addWidget(lb_resource) p_top.addLayout(p_info) p_bottom = QHBoxLayout() self.pb_deselect = QPushButton(_("Deselect all")) self.pb_deselect.clicked.connect(self.pb_deselect_clicked) self.pb_deselect.setEnabled(self.selected_file_count() > 0) p_bottom.addWidget(self.pb_deselect) p_bottom.addStretch(1) self.pb_ok = QPushButton(_("OK")) self.pb_ok.setAutoDefault(True) self.pb_ok.clicked.connect(self.accept) p_bottom.addWidget(self.pb_ok) pb_cancel = QPushButton(_("Cancel")) pb_cancel.clicked.connect(self.reject) p_bottom.addWidget(pb_cancel) vert.addLayout(p_top) vert.addLayout(p_bottom) self.setLayout(vert) self.resize(self.config.explorer_width(), self.config.explorer_height()) width = self.view.width() - 50 self.view.setColumnWidth(0, width / 2) self.view.setColumnWidth(1, width / 6) self.view.setColumnWidth(2, width / 6) self.view.setColumnWidth(3, width / 6) def __persist__(self): # persist properties of the explorer self.config.set_explorer_width(self.width()) self.config.set_explorer_height(self.height()) self.config.persist() def __compute_filenames__(self, item_selection): # item_selection: a QItemSelection # return corresponding absolute filenames as a set, including filenames in underlying folders s = set() for index in item_selection.indexes(): # we have an index for each column in the model if index.column() == 0: path = index.model().filePath(index) if os.path.isdir(path): for root, directories, filenames in os.walk(path): for filename in filenames: if self.filename_filter.accept(filename): s.add(os.path.join(root, filename)) elif os.path.isfile(path): s.add(path) else: self.logger.warn("isUnknownThing", path) return s def showEvent(self, QShowEvent): # self.pb_ok.setFocus() pass def set_filename_filter(self, filename_filter): # set the FilenameFilter self.filename_filter = filename_filter def selected_file_count(self): return len(self.file_set) def selected_file_set(self): return frozenset(self.file_set) def selection_changed(self, selected, deselected): # selected, deselected: PyQt5.QtCore.QItemSelection selected_filenames = self.__compute_filenames__(selected) self.file_set.update(selected_filenames) deselected_filenames = self.__compute_filenames__(deselected) self.file_set.difference_update(deselected_filenames) self.pb_deselect.setEnabled(self.selected_file_count() > 0) self.lb_selection_count.setText(str(self.selected_file_count()) + " " + _("resources selected")) def item_expanded(self, index): # index: a QModelIndex # show all child items selected/deselected in accordance with state of parent folder pass def item_collapsed(self, index): pass def pb_deselect_clicked(self): self.view.selectionModel().clear() def hideEvent(self, QHideEvent): self.__persist__()
class _LocatorDialog(QDialog): """Locator widget and implementation """ def __init__(self, parent, commandClasses): QDialog.__init__(self, parent) self._terminated = False self._commandClasses = commandClasses self._createUi() self._loadingTimer = QTimer(self) self._loadingTimer.setSingleShot(True) self._loadingTimer.setInterval(200) self._loadingTimer.timeout.connect(self._applyLoadingCompleter) self._completerLoaderThread = _CompleterLoaderThread(self) self.finished.connect(self._terminate) self._command = None self._updateCurrentCommand() def _createUi(self): self.setWindowTitle(core.project().path().replace(os.sep, '/') or 'Locator') self.setLayout(QVBoxLayout()) self.layout().setContentsMargins(0, 0, 0, 0) self.layout().setSpacing(1) biggerFont = self.font() biggerFont.setPointSizeF(biggerFont.pointSizeF() * 2) self.setFont(biggerFont) self._edit = _CompletableLineEdit(self) self._edit.updateCurrentCommand.connect(self._updateCurrentCommand) self._edit.enterPressed.connect(self._onEnterPressed) self._edit.installEventFilter(self) # catch Up, Down self._edit.setFont(biggerFont) self.layout().addWidget(self._edit) self.setFocusProxy(self._edit) self._table = QTreeView(self) self._table.setFont(biggerFont) self._model = _CompleterModel() self._table.setModel(self._model) self._table.setItemDelegate(HTMLDelegate(self._table)) self._table.setRootIsDecorated(False) self._table.setHeaderHidden(True) self._table.clicked.connect(self._onItemClicked) self._table.setAlternatingRowColors(True) self._table.installEventFilter(self) # catch focus and give to the edit self.layout().addWidget(self._table) width = QFontMetrics(self.font()).width('x' * 64) # width of 64 'x' letters self.resize(width, width * 0.62) def _terminate(self): if not self._terminated: if self._command is not None: self._command.terminate() self._command = None self._edit.terminate() self._completerLoaderThread.terminate() if self._model: self._model.terminate() core.workspace().focusCurrentDocument() self._terminated = True def _updateCurrentCommand(self): """Try to parse line edit text and set current command """ if self._terminated: return newCommand = self._parseCurrentCommand() if newCommand is not self._command: if self._command is not None: self._command.updateCompleter.disconnect(self._updateCompletion) self._command.terminate() self._command = newCommand if self._command is not None: self._command.updateCompleter.connect(self._updateCompletion) self._updateCompletion() def _updateCompletion(self): """User edited text or moved cursor. Update inline and TreeView completion """ if self._command is not None: completer = self._command.completer() if completer is not None and completer.mustBeLoaded: self._loadingTimer.start() self._completerLoaderThread.loadCompleter(self._command, completer) else: self._applyCompleter(self._command, completer) else: self._applyCompleter(None, _HelpCompleter(self._commandClasses)) def _applyLoadingCompleter(self): """Set 'Loading...' message """ self._applyCompleter(None, StatusCompleter('<i>Loading...</i>')) def onCompleterLoaded(self, command, completer): """The method called from _CompleterLoaderThread when the completer is ready This code works in the GUI thread """ self._applyCompleter(command, completer) def _applyCompleter(self, command, completer): """Apply completer. Called by _updateCompletion or by thread function when Completer is constructed """ self._loadingTimer.stop() if command is not None: command.onCompleterLoaded(completer) if completer is None: completer = _HelpCompleter([command]) if self._edit.cursorPosition() == len(self._edit.text()): # if cursor at the end of text self._edit.setInlineCompletion(completer.inline()) self._model.setCompleter(completer) if completer.columnCount() > 1: self._table.resizeColumnToContents(0) self._table.setColumnWidth(0, self._table.columnWidth(0) + 20) # 20 px spacing between columns selItem = completer.autoSelectItem() if selItem: index = self._model.createIndex(selItem[0], selItem[1]) self._table.setCurrentIndex(index) def _onItemClicked(self, index): """Item in the TreeView has been clicked. Open file, if user selected it """ if self._command is not None: fullText = self._model.completer.getFullText(index.row()) if fullText is not None: self._command.onItemClicked(fullText) if self._tryExecCurrentCommand(): self.accept() return else: self._edit.setText(self._command.lineEditText()) self._updateCurrentCommand() self._edit.setFocus() def _onEnterPressed(self): """User pressed Enter or clicked item. Execute command, if possible """ if self._table.currentIndex().isValid(): self._onItemClicked(self._table.currentIndex()) else: self._tryExecCurrentCommand() def _tryExecCurrentCommand(self): if self._command is not None and self._command.isReadyToExecute(): self._command.execute() self.accept() return True else: return False def _chooseCommand(self, words): for cmd in self._commandClasses: if cmd.command == words[0]: return cmd, words[1:] isPath = words and (words[0].startswith('/') or words[0].startswith('./') or words[0].startswith('../') or words[0].startswith('~/') or words[0][1:3] == ':\\' or words[0][1:3] == ':/' ) isNumber = len(words) == 1 and all([c.isdigit() for c in words[0]]) def matches(cmd): if isPath: return cmd.isDefaultPathCommand elif isNumber: return cmd.isDefaultNumericCommand else: return cmd.isDefaultCommand for cmd in self._commandClasses: if matches(cmd): return cmd, words def _parseCurrentCommand(self): """ Parse text and try to get (command, completable word index) Return None if failed to parse """ # Split line text = self._edit.commandText() words = splitLine(text) if not words: return None # Find command cmdClass, args = self._chooseCommand(words) if isinstance(self._command, cmdClass): command = self._command else: command = cmdClass() # Try to make command object try: command.setArgs(args) except InvalidCmdArgs: return None else: return command def eventFilter(self, obj, event): if obj is self._edit: if event.type() == QEvent.KeyPress and \ event.key() in (Qt.Key_Up, Qt.Key_Down, Qt.Key_PageUp, Qt.Key_PageDown): return self._table.event(event) elif obj is self._table: if event.type() == QEvent.FocusIn: self._edit.setFocus() return True return False
class Window(QWidget): def __init__(self): super(Window, self).__init__() self.proxyModel = MySortFilterProxyModel(self) self.proxyModel.setDynamicSortFilter(True) self.sourceView = QTreeView() self.sourceView.setRootIsDecorated(False) self.sourceView.setAlternatingRowColors(True) sourceLayout = QHBoxLayout() sourceLayout.addWidget(self.sourceView) sourceGroupBox = QGroupBox("Original Model") sourceGroupBox.setLayout(sourceLayout) self.filterCaseSensitivityCheckBox = QCheckBox("Case sensitive filter") self.filterCaseSensitivityCheckBox.setChecked(True) self.filterPatternLineEdit = QLineEdit() self.filterPatternLineEdit.setText("Grace|Sports") filterPatternLabel = QLabel("&Filter pattern:") filterPatternLabel.setBuddy(self.filterPatternLineEdit) self.filterSyntaxComboBox = QComboBox() self.filterSyntaxComboBox.addItem("Regular expression", QRegExp.RegExp) self.filterSyntaxComboBox.addItem("Wildcard", QRegExp.Wildcard) self.filterSyntaxComboBox.addItem("Fixed string", QRegExp.FixedString) self.fromDateEdit = QDateEdit() self.fromDateEdit.setDate(QDate(2006, 12, 22)) self.fromDateEdit.setCalendarPopup(True) fromLabel = QLabel("F&rom:") fromLabel.setBuddy(self.fromDateEdit) self.toDateEdit = QDateEdit() self.toDateEdit.setDate(QDate(2007, 1, 5)) self.toDateEdit.setCalendarPopup(True) toLabel = QLabel("&To:") toLabel.setBuddy(self.toDateEdit) self.filterPatternLineEdit.textChanged.connect(self.textFilterChanged) self.filterSyntaxComboBox.currentIndexChanged.connect(self.textFilterChanged) self.filterCaseSensitivityCheckBox.toggled.connect(self.textFilterChanged) self.fromDateEdit.dateChanged.connect(self.dateFilterChanged) self.toDateEdit.dateChanged.connect(self.dateFilterChanged) self.proxyView = QTreeView() self.proxyView.setRootIsDecorated(False) self.proxyView.setAlternatingRowColors(True) self.proxyView.setModel(self.proxyModel) self.proxyView.setSortingEnabled(True) self.proxyView.sortByColumn(1, Qt.AscendingOrder) self.textFilterChanged() self.dateFilterChanged() proxyLayout = QGridLayout() proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3) proxyLayout.addWidget(filterPatternLabel, 1, 0) proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1) proxyLayout.addWidget(self.filterSyntaxComboBox, 1, 2) proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 2, 0, 1, 3) proxyLayout.addWidget(fromLabel, 3, 0) proxyLayout.addWidget(self.fromDateEdit, 3, 1, 1, 2) proxyLayout.addWidget(toLabel, 4, 0) proxyLayout.addWidget(self.toDateEdit, 4, 1, 1, 2) proxyGroupBox = QGroupBox("Sorted/Filtered Model") proxyGroupBox.setLayout(proxyLayout) mainLayout = QVBoxLayout() mainLayout.addWidget(sourceGroupBox) mainLayout.addWidget(proxyGroupBox) self.setLayout(mainLayout) self.setWindowTitle("Custom Sort/Filter Model") self.resize(500, 450) def setSourceModel(self, model): self.proxyModel.setSourceModel(model) self.sourceView.setModel(model) def textFilterChanged(self): syntax = QRegExp.PatternSyntax( self.filterSyntaxComboBox.itemData( self.filterSyntaxComboBox.currentIndex())) caseSensitivity = ( self.filterCaseSensitivityCheckBox.isChecked() and Qt.CaseSensitive or Qt.CaseInsensitive) regExp = QRegExp(self.filterPatternLineEdit.text(), caseSensitivity, syntax) self.proxyModel.setFilterRegExp(regExp) def dateFilterChanged(self): self.proxyModel.setFilterMinimumDate(self.fromDateEdit.date()) self.proxyModel.setFilterMaximumDate(self.toDateEdit.date())
class Window(QWidget): def __init__(self): super(Window, self).__init__() self.proxyModel = SortFilterProxyModel() self.proxyModel.setDynamicSortFilter(True) self.sourceGroupBox = QGroupBox("Original Model") self.proxyGroupBox = QGroupBox("Sorted/Filtered Model") self.sourceView = QTreeView() self.sourceView.setRootIsDecorated(False) self.sourceView.setAlternatingRowColors(True) self.proxyView = QTreeView() self.proxyView.setRootIsDecorated(False) self.proxyView.setAlternatingRowColors(True) self.proxyView.setModel(self.proxyModel) self.proxyView.setSortingEnabled(True) self.sortCaseSensitivityCheckBox = QCheckBox("Case sensitive sorting") self.filterCaseSensitivityCheckBox = QCheckBox("Case sensitive filter") self.filterPatternLineEdit = QLineEdit() self.filterPatternLabel = QLabel("&Filter pattern:") self.filterPatternLabel.setBuddy(self.filterPatternLineEdit) self.filterSyntaxComboBox = QComboBox() self.filterSyntaxComboBox.addItem("Regular expression", QRegExp.RegExp) self.filterSyntaxComboBox.addItem("Wildcard", QRegExp.Wildcard) self.filterSyntaxComboBox.addItem("Fixed string", QRegExp.FixedString) self.filterSyntaxLabel = QLabel("Filter &syntax:") self.filterSyntaxLabel.setBuddy(self.filterSyntaxComboBox) self.filterColumnComboBox = QComboBox() self.filterColumnComboBox.addItem("Signal Group") self.filterColumnComboBox.addItem("Signal Name") self.filterColumnComboBox.addItem("Unit") self.filterColumnLabel = QLabel("Filter &column:") self.filterColumnLabel.setBuddy(self.filterColumnComboBox) self.filterPatternLineEdit.textChanged.connect( self.filterRegExpChanged) self.filterSyntaxComboBox.currentIndexChanged.connect( self.filterRegExpChanged) self.filterColumnComboBox.currentIndexChanged.connect( self.filterColumnChanged) self.filterCaseSensitivityCheckBox.toggled.connect( self.filterRegExpChanged) self.sortCaseSensitivityCheckBox.toggled.connect(self.sortChanged) sourceLayout = QHBoxLayout() sourceLayout.addWidget(self.sourceView) self.sourceGroupBox.setLayout(sourceLayout) proxyLayout = QGridLayout() proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3) proxyLayout.addWidget(self.filterPatternLabel, 1, 0) proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1, 1, 2) proxyLayout.addWidget(self.filterSyntaxLabel, 2, 0) proxyLayout.addWidget(self.filterSyntaxComboBox, 2, 1, 1, 2) proxyLayout.addWidget(self.filterColumnLabel, 3, 0) proxyLayout.addWidget(self.filterColumnComboBox, 3, 1, 1, 2) proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 4, 0, 1, 2) proxyLayout.addWidget(self.sortCaseSensitivityCheckBox, 4, 2) self.proxyGroupBox.setLayout(proxyLayout) mainLayout = QVBoxLayout() mainLayout.addWidget(self.sourceGroupBox) mainLayout.addWidget(self.proxyGroupBox) self.setLayout(mainLayout) self.setWindowTitle("Basic Sort/Filter Model") self.resize(500, 450) self.proxyView.sortByColumn(SENDER, Qt.AscendingOrder) self.filterColumnComboBox.setCurrentIndex(SENDER) self.filterPatternLineEdit.setText("") self.filterCaseSensitivityCheckBox.setChecked(True) self.sortCaseSensitivityCheckBox.setChecked(True) def setSourceModel(self, model): self.proxyModel.setSourceModel(model) self.sourceView.setModel(model) def filterRegExpChanged(self): syntax_nr = self.filterSyntaxComboBox.itemData( self.filterSyntaxComboBox.currentIndex()) syntax = QRegExp.PatternSyntax(syntax_nr) if self.filterCaseSensitivityCheckBox.isChecked(): caseSensitivity = Qt.CaseSensitive else: caseSensitivity = Qt.CaseInsensitive regExp = QRegExp(self.filterPatternLineEdit.text(), caseSensitivity, syntax) self.proxyModel.setFilterRegExp(regExp) def filterColumnChanged(self): self.proxyModel.setFilterKeyColumn( self.filterColumnComboBox.currentIndex()) def sortChanged(self): if self.sortCaseSensitivityCheckBox.isChecked(): caseSensitivity = Qt.CaseSensitive else: caseSensitivity = Qt.CaseInsensitive self.proxyModel.setSortCaseSensitivity(caseSensitivity)
class LootWizard(QMainWindow): def __init__(self): super (LootWizard, self).__init__() self.hide() self._upToDateMessage = 'is up-to-date' self.initUI() def kill_on_init(self): QTimer.singleShot(0, app.quit) def initUI(self): data_found = False try: self.__getFileinfo(sys.argv[1]) except (IndexError, FileNotFoundError): directory = QStandardPaths.standardLocations(QStandardPaths.DocumentsLocation)[0] directory += "/My Games/Path of Exile" fname = QFileDialog.getOpenFileName(None, 'Open file', directory) if fname[0]: try: self.__getFileinfo(fname[0]) except FileNotFoundError: pass else: data_found = True else: data_found = True if not data_found: self.kill_on_init() else: self.initWindowUI() def initWindowUI(self): self.resetButton = QPushButton("Reset") self.resetButton.setEnabled(False) self.resetButton.clicked.connect(self.reset) self.orphanButton = SquareButton("+") self.orphanButton.hide() self.overwriteButton = QPushButton("Overwrite") self.overwriteButton.setStyleSheet("background-color: #EFC795") self.overwriteButton.setEnabled(False) self.overwriteButton.clicked.connect(self.overwrite) self.forceCheckBox = QCheckBox("&Always inherit") self.forceCheckBox.setToolTip('Smartblocks inherit from virtual blockgroups.<br/>Check me to change from a <b>smartblock</b> parent.') self.forceCheckBox.hide() hbox = QHBoxLayout() hbox2 = QHBoxLayout() hbox2.addWidget(self.forceCheckBox) hbox.addLayout(hbox2) hbox.addWidget(self.orphanButton) hbox.addStretch(1) hbox.addWidget(self.overwriteButton) hbox.addWidget(self.resetButton) vbox = QVBoxLayout() self.setWindowTitle('Loot Wizard') self.view = QTreeView() self.setCentralWidget(QWidget()) self.scrollLayout = QFormLayout() self.scrollWidget = QWidget() self.scrollWidget.setLayout(self.scrollLayout) self.orphanDialog = OrphanDialog(self) self.orphanButton.clicked.connect(self.openOrphans) vbox.addWidget(self.view) vbox.addLayout(hbox) self.scrollLayout.addRow(self.view) self.centralWidget().setLayout(vbox) self.model = SmartblockModel(self.file_content, self) self.statusBar().showMessage(self.file_info.fileName() + ' ' + self._upToDateMessage) self.forceCheckBox.stateChanged.connect(self.switchforce) self.view.setModel(self.model) self.view.expandAll() self.view.setAlternatingRowColors(True) self.resize(300, 600) self.show() def inform(self, flag, external_call = False, end_process = False): reset_flag = False # hidden first if flag: if external_call: message = 'has non-updated changes' else: message = 'has changed' reset_flag = True else: if end_process: message = 'is saved' else: message = self._upToDateMessage self.statusBar().showMessage(self.file_info.fileName() + ' ' + message) self.resetButton.setEnabled(reset_flag) self.overwriteButton.setEnabled(flag) def displayOrphan(self, display = True): # self.displayButton(self.orphanButton, display) pass def displayInheritance(self, display = True): self.displayButton(self.forceCheckBox, display) def displayButton(self, btn, display = True): if display: btn.show() else: btn.hide() def switchforce(self, state): self.model.forceInheritance = state == Qt.Checked def overwrite(self): self.overwriteButton.setEnabled(False) self.resetButton.setEnabled(False) # TODO: disable from elsewhere ?! if self.model.save(self.file_info.absoluteFilePath()): self.inform(False, False, True) def reset(self): self.model.resetStatus() def __getFileinfo(self, filename): self.file_content = ''.join(fileinput.input(filename)) self.file_info = QFileInfo(filename) def openOrphans(self): self.orphanDialog.show()
class TestDialog(QDialog): def __init__(self, data): super(TestDialog, self).__init__() self.data = copy.deepcopy(data) # Layout btOk = QPushButton("OK") btCancel = QPushButton("Cancel") self.tree = QTreeView() hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(btOk) hbox.addWidget(btCancel) vbox = QVBoxLayout() vbox.addLayout(hbox) vbox.addWidget(self.tree) self.setLayout(vbox) self.setGeometry(300, 300, 600, 400) # Button signals btCancel.clicked.connect(self.reject) btOk.clicked.connect(self.accept) # Tree view self.tree.setModel(QStandardItemModel()) self.tree.setAlternatingRowColors(True) self.tree.setSortingEnabled(True) self.tree.setHeaderHidden(False) self.tree.setSelectionBehavior(QAbstractItemView.SelectItems) self.tree.model().setHorizontalHeaderLabels(['Parameter', 'Value']) for x in self.data: if not self.data[x]: continue parent = QStandardItem(x) parent.setFlags(QtCore.Qt.NoItemFlags) for y in self.data[x]: value = self.data[x][y] child0 = QStandardItem(y) child0.setFlags(QtCore.Qt.NoItemFlags | QtCore.Qt.ItemIsEnabled) child1 = QStandardItem(repr(value)) child1.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable | ~QtCore.Qt.ItemIsSelectable) parent.appendRow([child0, child1]) self.tree.model().appendRow(parent) self.tree.expandAll() self.tree.model().itemChanged.connect(self.handleItemChanged) def get_data(self): return self.data def handleItemChanged(self, item): parent = self.data[item.parent().text()] key = item.parent().child(item.row(), 0).text() parent[key] = eval(item.text())
class App(QWidget): PROC_ID, PROC_NAME, PROC_USER, PROC_CPU, PROC_MEM, = range(5) def __init__(self): super().__init__() self.title = 'PyQt5 PROC LIST' self.left = 20 self.top = 20 self.width = 640 self.height = 840 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.dataGroupBox = QGroupBox("ps") self.dataView = QTreeView() self.dataView.setRootIsDecorated(False) self.dataView.setAlternatingRowColors(True) self.btn = QPushButton(self) self.btn.setText("Refresh") dataLayout = QHBoxLayout() dataLayout.addWidget(self.dataView) dataLayout.addWidget(self.btn) self.dataGroupBox.setLayout(dataLayout) self.model = self.createProcModel(self) self.dataView.setModel(self.model) #for proc in psutil.process_iter(): # self.addProc(model, proc.pid, proc.name(), proc.cpu_percent(), proc.memory_percent()) self.btn.clicked.connect(self.add_procs) mainLayout = QVBoxLayout() mainLayout.addWidget(self.dataGroupBox) self.setLayout(mainLayout) self.show() def createProcModel(self, parent): model = QStandardItemModel(0, 5, parent) model.setHeaderData(self.PROC_ID, Qt.Horizontal, "PID") model.setHeaderData(self.PROC_NAME, Qt.Horizontal, "Name") model.setHeaderData(self.PROC_USER, Qt.Horizontal, "USER") model.setHeaderData(self.PROC_CPU, Qt.Horizontal, "CPU%") model.setHeaderData(self.PROC_MEM, Qt.Horizontal, "MEM%") return model def addProc(self, model, process_id, process_name, proc_cpu, proc_mem): model.insertRow(0) model.setData(model.index(0, self.PROC_ID), process_id) model.setData(model.index(0, self.PROC_NAME), process_name) model.setData(model.index(0, self.PROC_CPU), proc_cpu) model.setData(model.index(0, self.PROC_MEM), proc_mem) def add_procs(self): if (self.model.hasChildren()): self.model.removeRows(0, self.model.rowCount()) for proc in psutil.process_iter(): self.model.insertRow(0) self.model.setData(self.model.index(0, self.PROC_ID), proc.pid) self.model.setData(self.model.index(0, self.PROC_NAME), proc.name()) self.model.setData(self.model.index(0, self.PROC_USER), proc.username()) self.model.setData(self.model.index(0, self.PROC_CPU), proc.cpu_percent()) self.model.setData(self.model.index(0, self.PROC_MEM), proc.memory_percent())
class FileTreeView(QWidget): on_menu_select = pyqtSignal(str, str) on_dir_change = pyqtSignal() def __init__(self, parent: Application): super().__init__() self.stopped = threading.Event() self.tree = QTreeView() self.handle = self.Handler(self) self.get_data_file() self.model = QtGui.QStandardItemModel() self.item_construct = {} v_box = QVBoxLayout() v_box.addWidget(self.finder()) v_box.addWidget(self.tree_view()) self.setLayout(v_box) self.watch_dog() parent.app_close.connect(self.exit_push) self.tree.setAlternatingRowColors(True) def exit_push(self): self.stopped.set() def finder(self): w_find = QLineEdit() w_find.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)) w_find.textChanged.connect(self.sort_list) w_find.setPlaceholderText("Search file..") return w_find def sort_list(self, text): list_sort = [] if text == "": self.show_tree(self.list_file) else: for data in self.list_file: if text.lower() in data.name().lower(): list_sort.append(data) self.show_tree(list_sort) def watch_dog(self): watch = ProcessRunnable(target=watch_winform, args=(get_data_folder(), self.handle, self.stopped)) watch.start() class Handler(watchdog.events.PatternMatchingEventHandler): def __init__(self, parent): super().__init__() self.parent = parent def on_created(self, event): print("Watchdog received created event", event.src_path, sep=" : ") asyncio.run( self.parent.file_change('create', event.src_path, event.is_directory)) def on_modified(self, event): print("Watchdog received modified event", event.src_path, sep=" : ") asyncio.run( self.parent.file_change('modify', event.src_path, event.is_directory)) def on_moved(self, event): print("Watchdog received move event", event.src_path, event.dest_path, sep=" : ") asyncio.run( self.parent.file_change('move', event.src_path, event.is_directory, event.dest_path)) def on_deleted(self, event): print("Watchdog received delete event", event.src_path, sep=" : ") asyncio.run( self.parent.file_change('delete', event.src_path, event.is_directory)) async def file_change(self, tpe, old, is_directory, new=""): if tpe == "move": self.import_single(self.model.invisibleRootItem(), new) self.remove_single(old) elif tpe == "delete": self.remove_single(old) elif tpe == "create": self.import_single(self.model.invisibleRootItem(), old) if is_directory: self.on_dir_change.emit() def get_data_file(self): self.list_file = [] self.create_list(get_data_folder()) def create_list(self, dir): lst = os.listdir(path=dir) for f in lst: path = os.path.join(dir, f) file = MyFile() if os.path.isdir(path): file.setParentName(os.path.basename(dir)) file.setParent(dir) file.setName(f) file.setDir(True) self.list_file.append(file) self.create_list(path) else: file.setParentName(os.path.basename(dir)) file.setParent(dir) file.setName(f) file.setDir(False) self.list_file.append(file) def tree_view(self): self.tree.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) self.tree.setContextMenuPolicy(Qt.CustomContextMenu) self.tree.customContextMenuRequested.connect(self.open_menu) self.tree.doubleClicked.connect(self.open_event) # self.model.itemChanged.connect(self.data_change) self.tree.setModel(self.model) self.show_tree(self.list_file) return self.tree def show_tree(self, list_file): self.model.clear() self.model.setHorizontalHeaderLabels(['List API']) self.tree.header().setDefaultSectionSize(180) parent = self.model.invisibleRootItem() self.item_construct = {} self.import_data(parent, list_file) self.tree.expandAll() def import_data_by_path(self, parent, path: list, index): if index < len(path): full = os.sep.join(path[:index + 1]) if full in self.item_construct: item = self.item_construct[full] else: item = QStandardItem(path[index]) if os.path.isfile(os.path.join(get_data_folder(), full)): item.setToolTip( self.read_description( os.path.join(get_data_folder(), full))) item.setEditable(False) if not os.path.isdir(os.path.join(get_data_folder(), full)): item.setIcon(QIcon(get_icon_link("text_snippet.svg"))) else: item.setIcon(QIcon(get_icon_link("folder_yellow.svg"))) item.setData(full) parent.appendRow(item) self.item_construct[full] = item self.import_data_by_path(item, path, index + 1) def read_description(self, path): try: data = json.loads(open(path, encoding='utf-8').read()) json_data = APIData() json_data.construct(data) x = json_data.parseSave().description() if x.isspace() or x == "": return ".." else: return x except Exception as ex: print(ex) return ".." def import_data(self, parent, list_data): for i in list_data: self.import_single(parent, i) def import_single(self, parent, file_path): path = self.path_extract(file_path) self.import_data_by_path(parent, path, 0) def remove_single(self, file_path): path = self.path_extract(file_path) full = os.sep.join(path[:len(path)]) if full in self.item_construct: item = self.item_construct[full] (item.parent() or self.model.invisibleRootItem()).removeRow(item.row()) del self.item_construct[full] def path_extract(self, file_path): if isinstance(file_path, MyFile): path = os.path.join(file_path.parent(), file_path.name()) else: path = file_path path = path.replace(get_data_folder(), "") if path.startswith(os.sep): path = path.replace(os.sep, "", 1) path = path.split(os.sep) return path def open_menu(self, position): indexes = self.tree.selectedIndexes() level = 0 data = "" item = None if len(indexes) > 0: index = indexes[0] item = self.model.itemFromIndex(index) data = item.data() data = os.path.join(get_data_folder(), data) if os.path.isdir(data): level = 1 else: level = 2 menu = QMenu() menu.setStyleSheet(open(get_stylesheet()).read()) rename_action = QAction(QIcon(get_icon_link('edit.svg')), '&Rename', self) rename_action.setStatusTip('Rename') new_action = QAction(QIcon(get_icon_link('create_new_folder.svg')), '&New Folder', self) new_action.setStatusTip('New Folder') refresh_action = QAction(QIcon(get_icon_link('refresh.svg')), '&Refresh', self) refresh_action.setStatusTip('Refresh') delete_action = QAction(QIcon(get_icon_link('delete_forever.svg')), '&Delete', self) delete_action.setStatusTip('Delete') open_action = QAction(QIcon(get_icon_link('open_in_new.svg')), '&Open', self) open_action.setStatusTip('Open file') expand_action = QAction(QIcon(), '&Expand', self) expand_action.setStatusTip('Expand') collapse_action = QAction(QIcon(), '&Collapse', self) collapse_action.setStatusTip('Collapse') duplicate_action = QAction(QIcon(get_icon_link('content_copy.svg')), '&Duplicate', self) duplicate_action.setStatusTip('Duplicate') copy_action = QAction(QIcon(get_icon_link('content_copy.svg')), '&Copy', self) copy_action.setStatusTip('Copy') move_action = QAction(QIcon(get_icon_link('zoom_out_map.svg')), '&Move', self) move_action.setStatusTip('Move') if level == 1: menu.addAction(rename_action) menu.addAction(new_action) menu.addSeparator() menu.addAction(refresh_action) menu.addAction(expand_action) menu.addAction(collapse_action) menu.addSeparator() menu.addAction(delete_action) elif level == 2: menu.addAction(open_action) menu.addAction(new_action) menu.addAction(refresh_action) menu.addSeparator() menu.addAction(rename_action) menu.addAction(duplicate_action) menu.addAction(copy_action) menu.addAction(move_action) menu.addSeparator() menu.addAction(delete_action) else: menu.addAction(new_action) menu.addAction(refresh_action) action = menu.exec_(self.tree.viewport().mapToGlobal(position)) if action == open_action: if data != "": self.on_menu_select.emit("open", data) elif action == refresh_action: self.get_data_file() self.show_tree(self.list_file) elif action == expand_action: if item is not None: self.tree.expand(item.index()) elif action == collapse_action: if item is not None: self.tree.collapse(item.index()) elif action == delete_action: if data != "": msg = QMessageBox() msg.setStyleSheet(open(get_stylesheet()).read()) msg.setIcon(QMessageBox.Warning) msg.setBaseSize(QSize(500, 300)) msg.setText("Delete file.") msg.setInformativeText("Are you sure to detele " + os.path.basename(data) + "?") msg.setWindowTitle("Delete Warning!!!") msg.addButton('Delete', QMessageBox.YesRole) msg.addButton('Move to Trash', QMessageBox.YesRole) msg.addButton('Cancel', QMessageBox.NoRole) rs = msg.exec_() if rs == 0: if os.path.isdir(data): shutil.rmtree(data) else: os.remove(data) elif rs == 1: send2trash(data) elif action == new_action: if data == "": data = get_data_folder() # input_name = QInputDialog() # input_name.setStyleSheet(open(get_stylesheet()).read()) # text, ok = input_name.getText(self, 'New Folder', 'Folder name:') inp = QComboDialog('New Folder', 'Folder name:', QComboDialog.Text) ok = inp.exec_() if ok and inp.select: if os.path.isdir(data): try: os.mkdir(os.path.join(data, inp.select)) except Exception as ex: alert = Alert("Error", "Create folder error", str(ex)) alert.exec_() print(ex) else: new = os.path.join(os.path.dirname(data), inp.select) try: os.mkdir(new) except Exception as ex: alert = Alert("Error", "Create folder error", str(ex)) alert.exec_() print(ex) elif action == rename_action: if data != "": # input_name = QInputDialog() # input_name.setStyleSheet(open(get_stylesheet()).read()) # text, ok = input_name.getText(self, 'Rename file', 'New name:') inp = QComboDialog('Rename file', 'New name:', QComboDialog.Text) ok = inp.exec_() if ok and inp.select: if os.path.isdir(data): new = os.path.join(os.path.dirname(data), inp.select) try: os.rename(data, new) except Exception as ex: alert = Alert("Error", "Rename folder error", str(ex)) alert.exec_() print(ex) else: filename, file_extension = os.path.splitext(data) new = os.path.join(os.path.dirname(data), inp.select + file_extension) try: os.rename(data, new) except Exception as ex: alert = Alert("Error", "Rename file error", str(ex)) alert.exec_() print(ex) elif action == move_action: if data != "": items = get_list_folder(get_data_folder(), get_data_folder()) # # item, ok = QInputDialog.getItem(self, "Select folder dialog", # "Select the destination folder", items, 0, False) inp = QComboDialog("Move", "Select the destination folder", QComboDialog.ComboBox, items) ok = inp.exec_() if ok and inp.select: folder = inp.select if inp.select.startswith(os.sep): folder = inp.select.replace(os.sep, "", 1) new = os.path.join(get_data_folder(), folder, os.path.basename(data)) try: os.rename(data, new) except Exception as ex: alert = Alert("Error", "Move file error", str(ex)) alert.exec_() print(ex) elif action == duplicate_action: if data != "": # input_name = QInputDialog() # input_name.setStyleSheet(open(get_stylesheet()).read()) # text, ok = input_name.getText(self, 'Duplicate file', 'New name:') inp = QComboDialog('Duplicate file', 'New name:', QComboDialog.Text) filename, file_extension = os.path.splitext(data) inp.set_init_text(filename) ok = inp.exec_() if ok and inp.select: new = os.path.join(os.path.dirname(data), inp.select + file_extension) try: copyfile(data, new) except Exception as ex: alert = Alert("Error", "Duplicate file error", str(ex)) alert.exec_() print(ex) elif action == copy_action: if data != "": items = get_list_folder(get_data_folder(), get_data_folder()) inp = QComboDialog("Copy", "Select the destination folder", QComboDialog.ComboBox, items) ok = inp.exec_() # item, ok = QInputDialog.getItem(self, "Select folder dialog", # "Select the destination folder", items, 0, False) if ok and inp.select: folder = inp.select if inp.select.startswith(os.sep): folder = inp.select.replace(os.sep, "", 1) new = os.path.join(get_data_folder(), folder, os.path.basename(data)) try: copyfile(data, new) except Exception as ex: alert = Alert("Error", "Copy file error", str(ex)) alert.exec_() print(ex) def open_event(self, index): item = self.model.itemFromIndex(index) if item is not None: data = item.data() data = os.path.join(get_data_folder(), data) if os.path.isdir(data): level = 1 else: level = 2 if data != "": if level == 2: self.on_menu_select.emit("open", data) elif level == 1: if not self.tree.isExpanded(item.index()): self.tree.collapse(item.index()) else: self.tree.expand(item.index())
class Window(QWidget): def __init__(self): super(Window, self).__init__() self.proxyModel = SortFilterProxyModel() self.proxyModel.setDynamicSortFilter(True) self.sourceGroupBox = QGroupBox("Original Model") self.proxyGroupBox = QGroupBox("Sorted/Filtered Model") self.sourceView = QTreeView() self.sourceView.setRootIsDecorated(False) self.sourceView.setAlternatingRowColors(True) self.proxyView = QTreeView() self.proxyView.setRootIsDecorated(False) self.proxyView.setAlternatingRowColors(True) self.proxyView.setModel(self.proxyModel) self.proxyView.setSortingEnabled(True) self.sortCaseSensitivityCheckBox = QCheckBox("Case sensitive sorting") self.filterCaseSensitivityCheckBox = QCheckBox("Case sensitive filter") self.filterPatternLineEdit = QLineEdit() self.filterPatternLabel = QLabel("&Filter pattern:") self.filterPatternLabel.setBuddy(self.filterPatternLineEdit) self.filterSyntaxComboBox = QComboBox() self.filterSyntaxComboBox.addItem("Regular expression", QRegExp.RegExp) self.filterSyntaxComboBox.addItem("Wildcard", QRegExp.Wildcard) self.filterSyntaxComboBox.addItem("Fixed string", QRegExp.FixedString) self.filterSyntaxLabel = QLabel("Filter &syntax:") self.filterSyntaxLabel.setBuddy(self.filterSyntaxComboBox) self.filterColumnComboBox = QComboBox() self.filterColumnComboBox.addItem("Subject") self.filterColumnComboBox.addItem("Sender") self.filterColumnComboBox.addItem("Date") self.filterColumnLabel = QLabel("Filter &column:") self.filterColumnLabel.setBuddy(self.filterColumnComboBox) self.filterPatternLineEdit.textChanged.connect(self.filterRegExpChanged) self.filterSyntaxComboBox.currentIndexChanged.connect(self.filterRegExpChanged) self.filterColumnComboBox.currentIndexChanged.connect(self.filterColumnChanged) self.filterCaseSensitivityCheckBox.toggled.connect(self.filterRegExpChanged) self.sortCaseSensitivityCheckBox.toggled.connect(self.sortChanged) sourceLayout = QHBoxLayout() sourceLayout.addWidget(self.sourceView) self.sourceGroupBox.setLayout(sourceLayout) proxyLayout = QGridLayout() proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3) proxyLayout.addWidget(self.filterPatternLabel, 1, 0) proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1, 1, 2) proxyLayout.addWidget(self.filterSyntaxLabel, 2, 0) proxyLayout.addWidget(self.filterSyntaxComboBox, 2, 1, 1, 2) proxyLayout.addWidget(self.filterColumnLabel, 3, 0) proxyLayout.addWidget(self.filterColumnComboBox, 3, 1, 1, 2) proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 4, 0, 1, 2) proxyLayout.addWidget(self.sortCaseSensitivityCheckBox, 4, 2) self.proxyGroupBox.setLayout(proxyLayout) mainLayout = QVBoxLayout() mainLayout.addWidget(self.sourceGroupBox) mainLayout.addWidget(self.proxyGroupBox) self.setLayout(mainLayout) self.setWindowTitle("Basic Sort/Filter Model") self.resize(500, 450) self.proxyView.sortByColumn(SENDER, Qt.AscendingOrder) self.filterColumnComboBox.setCurrentIndex(SENDER) self.filterPatternLineEdit.setText("Andy|Grace") self.filterCaseSensitivityCheckBox.setChecked(True) self.sortCaseSensitivityCheckBox.setChecked(True) def setSourceModel(self, model): self.proxyModel.setSourceModel(model) self.sourceView.setModel(model) def filterRegExpChanged(self): syntax_nr = self.filterSyntaxComboBox.itemData(self.filterSyntaxComboBox.currentIndex()) syntax = QRegExp.PatternSyntax(syntax_nr) if self.filterCaseSensitivityCheckBox.isChecked(): caseSensitivity = Qt.CaseSensitive else: caseSensitivity = Qt.CaseInsensitive regExp = QRegExp(self.filterPatternLineEdit.text(), caseSensitivity, syntax) self.proxyModel.setFilterRegExp(regExp) def filterColumnChanged(self): self.proxyModel.setFilterKeyColumn(self.filterColumnComboBox.currentIndex()) def sortChanged(self): if self.sortCaseSensitivityCheckBox.isChecked(): caseSensitivity = Qt.CaseSensitive else: caseSensitivity = Qt.CaseInsensitive self.proxyModel.setSortCaseSensitivity(caseSensitivity)
if __name__ == '__main__': from timeit import default_timer app = QApplication(sys.argv) t = default_timer() items = [] for i in range(9999): item = TreeItem(f'root_{i:04}') items.append(item) for j in range(10): child = item.appendChild(f'item__{i:04}/{j}') for k in range(10): child.appendChild(f'item__{i:04}/{j}/{k}') print(f'Elapsed time: {default_timer() - t:.2f} secs') model = TreeModel() model.setModelData(items) view = QTreeView() view.setWindowTitle("Simple Tree Model") view.setAlternatingRowColors(True) view.setUniformRowHeights(True) # Allows for scrolling optimizations. view.setModel(model) view.show() sys.exit(app.exec_())