def show_context_menu(self, point): item = self.currentItem() def key(k): sc = unicode_type(QKeySequence(k | Qt.CTRL).toString(QKeySequence.NativeText)) return ' [%s]'%sc if item is not None: m = QMenu() m.addAction(QIcon(I('edit_input.png')), _('Change the location this entry points to'), self.edit_item) m.addAction(QIcon(I('modified.png')), _('Bulk rename all selected items'), self.bulk_rename) m.addAction(QIcon(I('trash.png')), _('Remove all selected items'), self.del_items) m.addSeparator() ci = unicode_type(item.data(0, Qt.DisplayRole) or '') p = item.parent() or self.invisibleRootItem() idx = p.indexOfChild(item) if idx > 0: m.addAction(QIcon(I('arrow-up.png')), (_('Move "%s" up')%ci)+key(Qt.Key_Up), self.move_up) if idx + 1 < p.childCount(): m.addAction(QIcon(I('arrow-down.png')), (_('Move "%s" down')%ci)+key(Qt.Key_Down), self.move_down) if item.parent() is not None: m.addAction(QIcon(I('back.png')), (_('Unindent "%s"')%ci)+key(Qt.Key_Left), self.move_left) if idx > 0: m.addAction(QIcon(I('forward.png')), (_('Indent "%s"')%ci)+key(Qt.Key_Right), self.move_right) m.addSeparator() case_menu = QMenu(_('Change case')) case_menu.addAction(_('Upper case'), self.upper_case) case_menu.addAction(_('Lower case'), self.lower_case) case_menu.addAction(_('Swap case'), self.swap_case) case_menu.addAction(_('Title case'), self.title_case) case_menu.addAction(_('Capitalize'), self.capitalize) m.addMenu(case_menu) m.exec_(QCursor.pos())
def workaround_broken_under_mouse(ch): import sip from PyQt5.Qt import QCursor, QToolButton # See https://bugreports.qt-project.org/browse/QTBUG-40233 if isinstance(ch, QToolButton) and not sip.isdeleted(ch): ch.setAttribute(Qt.WA_UnderMouse, ch.rect().contains(ch.mapFromGlobal(QCursor.pos()))) ch.update()
def show_context_menu(self, point): idx = self.currentIndex() if idx and idx.isValid() and not idx.data(Qt.UserRole): m = QMenu() m.addAction(QIcon(I('view.png')), _('View this cover at full size'), self.show_cover) m.addAction(QIcon(I('edit-copy.png')), _('Copy this cover to clipboard'), self.copy_cover) m.exec_(QCursor.pos())
def createMisAlignment(self, mis_layout, callback): controls0 = [] controls1 = [] for i in range(3): # Translation layout0 = QHBoxLayout() slider = QFloatSlider(Qt.Horizontal, self) slider.setRange(-50.0, 50.0, 101) slider.setFloatValue(0.0) slider.floatValueChanged.connect(lambda value: QToolTip.showText( QCursor.pos(), "%f" % (value), None)) button = QToolButton() act = QAction() act.setText("T" + chr(88 + i)) button.setDefaultAction(act) button.clicked.connect(callback) layout0.addWidget(slider) layout0.addWidget(button) controls0.append((slider, button)) # Rotation layout1 = QHBoxLayout() slider = QFloatSlider(Qt.Horizontal, self) slider.setRange(-90.0, 90.0, 37) slider.setFloatValue(0.0) slider.floatValueChanged.connect(lambda value: QToolTip.showText( QCursor.pos(), "%f" % (value), None)) button = QToolButton() act = QAction() act.setText("R" + chr(88 + i)) button.setDefaultAction(act) button.clicked.connect(callback) layout1.addWidget(slider) layout1.addWidget(button) mis_layout.addItem(layout0) mis_layout.addItem(layout1) controls1.append((slider, button)) return controls0 + controls1
def createMovement(self, inLayout, onPressed, onReleased): controls0 = [] controls1 = [] for i in range(3): layout0 = QHBoxLayout() slider = QFloatSlider(Qt.Horizontal, self) slider.setRange(-50.0, 50.0, 101) slider.setFloatValue(0.0) slider.floatValueChanged.connect( lambda value, slider=slider, i=i: QToolTip.showText( QCursor.pos(), "T" + chr(88 + i) + ": %f" % (value), None)) slider.sliderPressed.connect(lambda i=i: onPressed(0, i)) slider.sliderReleased.connect(lambda i=i: onReleased(0, i)) layout0.addWidget(slider) controls0.append(slider) label = QLabel("T" + chr(88 + i)) layout0.addWidget(label) inLayout.addItem(layout0) layout1 = QHBoxLayout() slider = QFloatSlider(Qt.Horizontal, self) slider.setRange(-45.0, 45.0, 91) slider.setFloatValue(0.0) slider.floatValueChanged.connect( lambda value, slider=slider, i=i: QToolTip.showText( QCursor.pos(), "R" + chr(88 + i) + ": %f" % (value), None)) slider.sliderPressed.connect( lambda i=i, slider=slider: onPressed(1, i)) slider.sliderReleased.connect( lambda i=i, slider=slider: onReleased(1, i)) layout1.addWidget(slider) label = QLabel("R" + chr(88 + i)) layout1.addWidget(label) controls1.append(slider) inLayout.addItem(layout1) return controls0, controls1
def eventFilter(self, qobject, qevent): qtype = qevent.type() # print("qtype",qtype) # print("qobject",qobject) if qtype == 82: counter = len(self.lw_main.selectedIndexes()) # 右键所在的位置又可能是空白处 if counter == 1: i = self.lw_main.indexAt(QCursor.pos()) if not i.isValid(): print("valid") counter = len(self.lw_main.selectedIndexes()) else: print("invalid") # 处理选中的文件 if counter >= 1: action = self.file_menu.exec_(self.file_popup_menu.menu_item, QCursor.pos()) if action: file_list = [ self.fileSystemModel.itemData(i)[0] for i in self.lw_main.selectedIndexes() ] self.script_manager.run_script(action.text(), self.le_path.text(), file_list) # 选中空白处,返回上层目录 else: parent_dir = dirname(self.le_path.text()) if parent_dir == self.le_path.text() and self.isWindowsOS: pass else: self.le_path.setText(parent_dir) self.on_pb_load_path_clicked() return False
def show_context_menu(self, point): item = self.currentItem() def key(k): sc = unicode_type( QKeySequence(k | Qt.Modifier.CTRL).toString( QKeySequence.SequenceFormat.NativeText)) return ' [%s]' % sc if item is not None: m = QMenu(self) m.addAction(QIcon(I('edit_input.png')), _('Change the location this entry points to'), self.edit_item) m.addAction(QIcon(I('modified.png')), _('Bulk rename all selected items'), self.bulk_rename) m.addAction(QIcon(I('trash.png')), _('Remove all selected items'), self.del_items) m.addSeparator() ci = unicode_type(item.data(0, Qt.ItemDataRole.DisplayRole) or '') p = item.parent() or self.invisibleRootItem() idx = p.indexOfChild(item) if idx > 0: m.addAction(QIcon(I('arrow-up.png')), (_('Move "%s" up') % ci) + key(Qt.Key.Key_Up), self.move_up) if idx + 1 < p.childCount(): m.addAction(QIcon(I('arrow-down.png')), (_('Move "%s" down') % ci) + key(Qt.Key.Key_Down), self.move_down) if item.parent() is not None: m.addAction(QIcon(I('back.png')), (_('Unindent "%s"') % ci) + key(Qt.Key.Key_Left), self.move_left) if idx > 0: m.addAction(QIcon(I('forward.png')), (_('Indent "%s"') % ci) + key(Qt.Key.Key_Right), self.move_right) m.addSeparator() case_menu = QMenu(_('Change case'), m) case_menu.addAction(_('Upper case'), self.upper_case) case_menu.addAction(_('Lower case'), self.lower_case) case_menu.addAction(_('Swap case'), self.swap_case) case_menu.addAction(_('Title case'), self.title_case) case_menu.addAction(_('Capitalize'), self.capitalize) m.addMenu(case_menu) m.exec_(QCursor.pos())
def show_context_menu(self): menu = QMenu(self) item = self.current_item() if not item: return actions = list() file_menu = menu.addMenu(QIcon("res/delete.svg"), "File operations") delete_action = QAction(QIcon("res/delete.svg"), "Delete", file_menu) actions.append(delete_action) file_menu.addActions(actions) file_menu.setEnabled(True) menu.setEnabled(True) action = menu.exec_(QCursor.pos())
def eventFilter(self, qobject, qevent): qtype = qevent.type() print(qtype) action = None if qtype == QEvent.HoverEnter: if qobject == self.pb_bold: action = self.popMenu.exec_(listActionHandler.bold, QCursor.pos()) elif qobject == self.pb_heading: action = self.popMenu.exec_(listActionHandler.headdings, QCursor.pos()) elif qobject == self.pb_unsort_list: action = self.popMenu.exec_(listActionHandler.unsort_lists, QCursor.pos()) if action: print(action.text()) listActionHandler.handle_action(action, self.te_editor.textCursor()) # ~ elif qtype == QEvent.Leave: else: pass # ~ print("leave") # ~ self.popMenu.close() return False
def contextMenuEvent(self, event): """ Item右键点击事件 """ self._rightClickPoint = event.pos() item = self.itemAt(self._rightClickPoint) self._tableCountAction.setText('行: {0}, 列: {1}'.format( self.rowCount(), self.columnCount())) if item is None: self._markAction.setEnabled(False) self._highlightAction.setEnabled(False) else: itemState = 0 # 0: not marked or highlighted, 1: marked, 2: highlighted if self._markedItem is not None and self._markedItem.row( ) == item.row(): itemState = 1 else: for highlightedItem in self._highlightedItems: if highlightedItem[0].row() == item.row(): itemState = 2 if itemState == 0: self._markAction.setText('标记') self._markAction.setEnabled(True) self._highlightAction.setText('高亮') self._highlightAction.setEnabled(True) elif itemState == 1: self._markAction.setText('取消标记') self._markAction.setEnabled(True) self._highlightAction.setEnabled(False) else: self._highlightAction.setText('取消高亮') self._highlightAction.setEnabled(True) self._markAction.setEnabled(False) # at last, set visible mark action if self._markedItem is not None: self._visibleMarkAction.setText('定位标记') self._visibleMarkAction.setEnabled(True) else: self._visibleMarkAction.setEnabled(False) self._itemMenu.popup(QCursor.pos())
def showListContextMenu(self): self.listWidget.listContextMenu.move(QCursor.pos()) self.listWidget.listContextMenu.show()
def exec(self, x=None, y=None): if x is None: super(Menu, self).exec(QCursor.pos()) else: super(Menu, self).exec(QPoint(x, y))
def sample_direction(self,time_): if len(self.mouse_positions)>1: self.mouse_positions[time_]=QCursor.pos()
def showContextMenu(self): self.treeWidget.treeContextMenu.move(QCursor.pos()) self.treeWidget.treeContextMenu.show()
def contextMenuEvent(self, event): """右键点击事件""" self._menu.popup(QCursor.pos())
def sample_pos(self,time_): self.mouse_positions[time_]=QCursor.pos()
def collapse_menu_hovered(self, action): tip = action.toolTip() if tip == '*': tip = '' QToolTip.showText(QCursor.pos(), tip)
def showTaskMenu(self, pos): item: QTreeWidgetItem = self.treePlot.itemAt(pos) index = self.treePlot.indexAt(pos) if not item: return if not index: return parent_item = item.parent() if parent_item: task_item = parent_item sub_task_item = item else: task_item = item sub_task_item = None task: PlotTask = task_item.data(0, Qt.UserRole) if sub_task_item: sub_task: PlotSubTask = sub_task_item.data(0, Qt.UserRole) working = sub_task.working else: sub_task: PlotSubTask = task.current_sub_task working = task.working menu = QMenu(self) action_detail = menu.addAction(u"查看日志") action_modify = None action_delete = None action_stop = None action_suspend = None action_suspend_for_30min = None action_suspend_for_1h = None action_suspend_for_2h = None action_suspend_for_3h = None action_suspend_for_4h = None action_resume = None action_next_stop = None action_locate_temp = None action_clean_temp = None action_increase_number = None action_reduce_number = None if not sub_task_item and task.count != 1: action_detail.setDisabled(True) if task.finish: if not sub_task_item: menu.addSeparator() action_delete = menu.addAction(u"删除") if not task.success: if os.path.exists(task.temporary_folder): action_clean_temp = menu.addAction(u"清除临时文件") elif working: if not sub_task_item: menu.addSeparator() action_modify = menu.addAction(u"编辑") menu.addSeparator() if task.specify_count: action_increase_number = menu.addAction(u"增加数量") if task.pending_count(): action_reduce_number = menu.addAction(u"减少数量") else: action_next_stop = menu.addAction(u"下个任务停止") action_next_stop.setCheckable(True) action_next_stop.setChecked(task.next_stop) if not sub_task_item or sub_task.working: menu.addSeparator() if task.delay_remain(): action_stop = menu.addAction(u"取消") else: action_stop = menu.addAction(u"停止") if sub_task.suspend: action_resume = menu.addAction(u"继续") else: action_suspend = menu.addAction(u"暂停") menu_suspend_for = menu.addMenu(u"暂停时间") action_suspend_for_30min = menu_suspend_for.addAction( u"30分钟") action_suspend_for_1h = menu_suspend_for.addAction(u"1小时") action_suspend_for_2h = menu_suspend_for.addAction(u"2小时") action_suspend_for_3h = menu_suspend_for.addAction(u"3小时") action_suspend_for_4h = menu_suspend_for.addAction(u"4小时") if os.path.exists( task.temporary_folder) and platform.system() == 'Windows': menu.addSeparator() action_locate_temp = menu.addAction(u"浏览临时文件") action = menu.exec(QCursor.pos()) if action is None: return if action == action_detail: self.showTaskOutput(index) elif action == action_modify: dlg = CreatePlotDialog(task=task) if dlg.exec() == dlg.rejected: return self.task_manager.save_tasks() elif action == action_delete: all_files, total_size = task.get_temp_files() if len(all_files): if QMessageBox.information( self, '提示', f"确定要删除临时目录吗?\n{len(all_files)}个文件\n{size_to_str(total_size)}GB", QMessageBox.Ok | QMessageBox.Cancel) == QMessageBox.Cancel: return if os.path.exists( task.temporary_folder) and not task.remove_temp_folder(): QMessageBox.warning(self, '提示', '清除临时目录失败!') return self.treePlot.takeTopLevelItem(index.row()) self.task_manager.remove_task(task) elif action == action_stop: if QMessageBox.information( self, '提示', "确定要停止任务吗?停止后无法恢复", QMessageBox.Ok | QMessageBox.Cancel) == QMessageBox.Cancel: return if sub_task_item: sub_task.worker.stop() else: for sub in task.sub_tasks: if sub.working: sub.worker.stop() elif action == action_suspend: if sub_task_item: sub_task.worker.suspend() else: for sub in task.sub_tasks: if sub.working and not sub.worker.copying: sub.worker.suspend() elif action == action_suspend_for_30min: time_for_suspend = 60 * 30 if sub_task_item: sub_task.worker.suspend(time_for_suspend) else: for sub in task.sub_tasks: if sub.working and not sub.worker.copying: sub.worker.suspend(time_for_suspend) elif action == action_suspend_for_1h: time_for_suspend = 60 * 60 * 1 if sub_task_item: sub_task.worker.suspend(time_for_suspend) else: for sub in task.sub_tasks: if sub.working and not sub.worker.copying: sub.worker.suspend(time_for_suspend) elif action == action_suspend_for_2h: time_for_suspend = 60 * 60 * 2 if sub_task_item: sub_task.worker.suspend(time_for_suspend) else: for sub in task.sub_tasks: if sub.working and not sub.worker.copying: sub.worker.suspend(time_for_suspend) elif action == action_suspend_for_3h: time_for_suspend = 60 * 60 * 3 if sub_task_item: sub_task.worker.suspend(time_for_suspend) else: for sub in task.sub_tasks: if sub.working and not sub.worker.copying: sub.worker.suspend(time_for_suspend) elif action == action_suspend_for_4h: time_for_suspend = 60 * 60 * 4 if sub_task_item: sub_task.worker.suspend(time_for_suspend) else: for sub in task.sub_tasks: if sub.working and not sub.worker.copying: sub.worker.suspend(time_for_suspend) elif action == action_resume: if sub_task_item: sub_task.worker.resume() else: for sub in task.sub_tasks: if sub.working: sub.worker.resume() elif action == action_next_stop: task.next_stop = not task.next_stop elif action == action_locate_temp: folder = task.temporary_folder.replace('/', '\\') run('explorer /select, ' + folder) elif action == action_clean_temp: all_files, total_size = task.get_temp_files() if len(all_files) == 0: QMessageBox.information(self, '提示', '没有临时文件') return if QMessageBox.information( self, '提示', f"确定要清除临时文件吗?\n{len(all_files)}个文件\n{size_to_str(total_size)}GB", QMessageBox.Ok | QMessageBox.Cancel) == QMessageBox.Cancel: return if not task.delete_temp_files(): QMessageBox.warning(self, '提示', '清除临时文件失败!') elif action == action_increase_number: sub_task = task.increase() if task.count == 2: self.addSubTaskItem(item, task.sub_tasks[0]) self.addSubTaskItem(item, sub_task) elif action == action_reduce_number: sub_task = task.sub_tasks[-1] if sub_task.finish or sub_task.working: return self.removeSubTaskItem(item, sub_task) task.reduce() if task.count == 1: self.removeSubTaskItem(item, task.sub_tasks[0]) if not sub_task_item: sub_task_item = self.getSubItemFromSubTask(item, sub_task) if sub_task_item: self.updateSubTaskItem(sub_task_item, sub_task)
def paintEvent(self, event): ''' @param: event QPaintEvent ''' p = QPainter(self) # Just draw separator if self._bookmark.isSeparator(): opt = QStyleOption() opt.initFrom(self) opt.state |= QStyle.State_Horizontal self.style().drawPrimitive(QStyle.PE_IndicatorToolBarSeparator, opt, p) return option = QStyleOptionButton() self.initStyleOption(option) # We are manually drawing the arrow option.features &= ~QStyleOptionButton.HasMenu # Draw button base (only under mouse, this is autoraise button) if self.isDown() or self.hitButton(self.mapFromGlobal(QCursor.pos())): option.state |= QStyle.State_AutoRaise | QStyle.State_Raised self.style().drawPrimitive(QStyle.PE_PanelButtonTool, option, p, self) if self.isDown(): shiftX = self.style().pixelMetric(QStyle.PM_ButtonShiftHorizontal, option, self) shiftY = self.style().pixelMetric(QStyle.PM_ButtonShiftVertical, option, self) else: shiftX = 0 shiftY = 0 height = option.rect.height() center = height / 2 + option.rect.top() + shiftY iconSize = 16 iconYPos = center - iconSize / 2 leftPosition = self.PADDING + shiftX rightPosition = option.rect.right() - self.PADDING # Draw icon if not self._showOnlyText: iconRect = QRect(leftPosition, iconYPos, iconSize, iconSize) p.drawPixmap( QStyle.visualRect(option.direction, option.rect, iconRect), self._bookmark.icon().pixmap(iconSize)) leftPosition = iconRect.right() + self.PADDING # Draw menu arrow if not self._showOnlyIcon and self.menu(): arrowSize = 8 opt = QStyleOption() opt.initFrom(self) rect = QRect(rightPosition - 8, center - arrowSize / 2, arrowSize, arrowSize) opt.rect = QStyle.visualRect(option.direction, option.rect, rect) opt.state &= ~QStyle.State_MouseOver self.style().drawPrimitive(QStyle.PE_IndicatorArrowDown, opt, p, self) rightPosition = rect.left() - self.PADDING # Draw text if not self._showOnlyIcon: textWidth = rightPosition - leftPosition textYPos = center - self.fontMetrics().height() / 2 txt = self.fontMetrics().elidedText(self._bookmark.title(), Qt.ElideRight, textWidth) textRect = QRect(leftPosition, textYPos, textWidth, self.fontMetrics().height()) self.style().drawItemText( p, QStyle.visualRect(option.direction, option.rect, textRect), Qt.TextSingleLine | Qt.AlignCenter, option.palette, True, txt)
def exec(self, x = None, y = None): if x is None: super(Menu, self).exec(QCursor.pos()) else: super(Menu, self).exec(QPoint(x, y))
def on_toolBar_clicked(self, action): action_text = action.text() if action_text == "收藏夹": self.lb_sidebar.setText(action_text) self.init_bookmark() elif action_text == "标签": self.lb_sidebar.setText(action_text) self.init_session() elif action_text == "菜单": action = self.main_menu.exec_(toolbar_menu.menu_item, QCursor.pos()) if action: self.toolbar_menu.handle_action(action) elif action_text == "最近打开的文件": self.lb_sidebar.setText(action_text) self.lw_sidebar.clear() for f in self.last_open_file: self.add_sidebar_item(f) elif action_text == "主页": self.go_home() elif action_text == "终端": if self.isWindowsOS: chdir(self.le_path.text()) startfile("cmd.exe") else: system('x-terminal-emulator --working-directory={} &'.format( self.le_path.text())) elif action_text == "设备": self.lb_sidebar.setText(action_text) self.init_drivers() elif action_text == "我的电脑": if self.isWindowsOS: print("explorer.exe '" + self.le_path.text() + "'") try: startfile(self.le_path.text()) # system("start C:\Users\bkd") except Exception as e: print(str(e)) else: system('xdg-open ' + self.le_path.text()) elif action_text == "返回上层": paren_dir = dirname(self.le_path.text()) self.le_path.setText(paren_dir) self.on_pb_load_path_clicked() elif action_text == "显示隐藏文件": if action.isChecked(): self.fileFilter_hidden = QDir.Hidden self.fileSystemModel.setFilter(self.fileFilter | QDir.Hidden) else: self.fileFilter_hidden = None self.fileSystemModel.setFilter(self.fileFilter) elif action_text == "显示文件夹": if action.isChecked(): if self.fileFilter_hidden: self.fileSystemModel.setFilter(QDir.Dirs | QDir.Hidden | QDir.NoDot | QDir.NoDotDot) else: self.fileSystemModel.setFilter(QDir.Dirs | QDir.NoDot | QDir.NoDotDot) else: self.fileSystemModel.setFilter(self.fileFilter) elif action_text == "新增": if self.lb_sidebar.text() == "收藏夹": self.add_sidebar_item(self.le_path.text()) kdconfig.list_add("global", "bookmark", self.le_path.text()) elif self.lb_sidebar.text() == "标签": self.session_list.add(self.le_path.text()) self.add_sidebar_item(self.le_path.text()) print(self.session_list) elif action_text == "删除": if self.lb_sidebar.text() == "收藏夹": print(self.lw_sidebar.currentRow()) kdconfig.list_del("global", "bookmark", self.le_path.text()) self.bookmark_list.discard(self.le_path.text()) self.lw_sidebar.takeItem(self.lw_sidebar.currentRow()) print(self.bookmark_list) elif self.lb_sidebar.text() == "标签": self.session_list.remove(self.le_path.text())