RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1288891
Accepted
Guamokolatokint
Guamokolatokint
Asked:2022-06-02 14:32:18 +0000 UTC2022-06-02 14:32:18 +0000 UTC 2022-06-02 14:32:18 +0000 UTC

QTableWidget 中的上下文菜单

  • 772

在GUI中,当您右键单击表时,контекстное меню. 但问题是,之后这个上下文菜单不仅可以在表格中调用,还可以在表格之外的应用程序窗口中的任何位置调用QTableWidget。

如何解决?
我需要调用特定表上的特定菜单。而别处。

这是一个简单的GUI示例,其中清楚地重现了错误:

应用程序.py

import sys
from PySide2 import QtWidgets
from UI_test import Ui_Form
from PySide2 import QtWidgets, QtGui, QtCore

class App(QtWidgets.QWidget):
    def __init__(self, parent = None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)

    def contextMenuEvent(self,e):
        #создание и вызов контекстного меню
        self.menu = QtWidgets.QMenu(self)
        Action1 = QtWidgets.QAction('Action1', self)
        Action2 = QtWidgets.QAction('Action2', self)
        Action3 = QtWidgets.QAction('Action3', self)
        self.menu.addAction(Action1)
        self.menu.addAction(Action2)
        self.menu.addAction(Action3)
        self.menu.popup(QtGui.QCursor.pos())



if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = App()
    window.show()
    sys.exit(app.exec_())

UI_test.py

from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import Qt
from random import randint

class Ui_Form(object):
    def setupUi(self, Form):
        Form.resize(1300, 700)
        self.layout = QtWidgets.QHBoxLayout()
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.listWidget = QtWidgets.QListWidget()
        self.layout.addWidget(self.listWidget)
        self.stackedWidget = QtWidgets.QStackedWidget()
        self.layout.addWidget(self.stackedWidget)
        self.listWidget.currentRowChanged.connect(
        self.stackedWidget.setCurrentIndex)

        item1 = QtWidgets.QListWidgetItem(QtGui.QIcon('icons/settings.png'),'CamSettings', self.listWidget)
        item2 = QtWidgets.QListWidgetItem(QtGui.QIcon('icons/explore.png'),'Explore', self.listWidget)

        item1.setSizeHint(QtCore.QSize(10, 60))
        item2.setSizeHint(QtCore.QSize(10, 60))

        item1.setTextAlignment(QtCore.Qt.AlignCenter)
        item2.setTextAlignment(QtCore.Qt.AlignCenter)

        label1 = QtWidgets.QLabel('Это страница 1')
        label2= QtWidgets.QLabel('Это страница 2')
        label1.setAlignment(QtCore.Qt.AlignCenter)
        label2.setAlignment(QtCore.Qt.AlignCenter)
        label1.setStyleSheet('background: rgb(%d, %d, %d); margin: 50px;' % (
        randint(0, 255), randint(0, 255), randint(0, 255)))
        label2.setStyleSheet('background: rgb(%d, %d, %d); margin: 50px;' % (
        randint(0, 255), randint(0, 255), randint(0, 255)))

        self.table_cubes = QtWidgets.QTableWidget()
        self.table_cubes.setColumnCount(1)
        self.table_cubes.setObjectName('tableCubes')
        self.table_cubes.setHorizontalHeaderLabels(['Название куба'])
        header_class = self.table_cubes.horizontalHeader()
        header_class.hide()
        header_v_cube = self.table_cubes.verticalHeader()
        header_v_cube.setStyleSheet(' background-color: #232939;')
        self.table_cubes.setFixedWidth(310)
        self.table_cubes.setFixedHeight(330)
        self.table_cubes.setColumnWidth(0, 200)
        self.table_cubes.contextMenuEvent = Form.contextMenuEvent
        first_panel_left = QtWidgets.QVBoxLayout()
        first_panel_left.setAlignment(Qt.AlignTop)
        first_panel_frame_left = QtWidgets.QFrame()
        first_panel_frame_left.setMinimumWidth(200)
        first_panel_frame_left.setLayout(first_panel_left)
        first_panel_right = QtWidgets.QVBoxLayout()
        first_panel_right.addWidget(self.table_cubes)
        first_panel_right.addStretch()
        first_panel_frame_right = QtWidgets.QFrame()
        first_panel_frame_right.setLayout(first_panel_right)
        main_first_box = QtWidgets.QHBoxLayout()
        main_first_box.addWidget(first_panel_frame_left)
        main_first_box.addWidget(first_panel_frame_right)
        first_container = QtWidgets.QWidget()
        first_container.setLayout(main_first_box)
        self.stackedWidget.addWidget(first_container)
        self.stackedWidget.addWidget(label2)
        Form.setLayout(self.layout)
python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2022-06-02T16:16:14Z2022-06-02T16:16:14Z

    作为一种选择

    import sys
    from random import randint
    '''
    from PySide2 import QtCore, QtGui, QtWidgets
    from PySide2.QtCore import Qt
    '''
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.Qt import *
    
    #from UI_test import Ui_Form
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.resize(800, 500)
            self.layout = QtWidgets.QHBoxLayout()
            self.layout.setContentsMargins(0, 0, 0, 0)
            self.listWidget = QtWidgets.QListWidget()
            self.layout.addWidget(self.listWidget)
            self.stackedWidget = QtWidgets.QStackedWidget()
            self.layout.addWidget(self.stackedWidget)
            self.listWidget.currentRowChanged.connect(
            self.stackedWidget.setCurrentIndex)
    
            item1 = QtWidgets.QListWidgetItem(QtGui.QIcon('Ok.png'),'CamSettings', self.listWidget)
            item2 = QtWidgets.QListWidgetItem(QtGui.QIcon('im.png'),'Explore', self.listWidget)
    
            item1.setSizeHint(QtCore.QSize(10, 60))
            item2.setSizeHint(QtCore.QSize(10, 60))
    
            item1.setTextAlignment(QtCore.Qt.AlignCenter)
            item2.setTextAlignment(QtCore.Qt.AlignCenter)
    
            label1 = QtWidgets.QLabel('Это страница 1')
            label2= QtWidgets.QLabel('Это страница 2')
            label1.setAlignment(QtCore.Qt.AlignCenter)
            label2.setAlignment(QtCore.Qt.AlignCenter)
            label1.setStyleSheet('background: rgb(%d, %d, %d); margin: 50px;' % (
            randint(0, 255), randint(0, 255), randint(0, 255)))
            label2.setStyleSheet('background: rgb(%d, %d, %d); margin: 50px;' % (
            randint(0, 255), randint(0, 255), randint(0, 255)))
    
            self.table_cubes = QtWidgets.QTableWidget()
            self.table_cubes.setColumnCount(1)
            self.table_cubes.setObjectName('tableCubes')
            self.table_cubes.setHorizontalHeaderLabels(['Название куба'])
            header_class = self.table_cubes.horizontalHeader()
            header_class.hide()
            header_v_cube = self.table_cubes.verticalHeader()
            header_v_cube.setStyleSheet(' background-color: #232939;')
            self.table_cubes.setFixedWidth(310)
            self.table_cubes.setFixedHeight(330)
            self.table_cubes.setColumnWidth(0, 200)
    # -       self.table_cubes.contextMenuEvent = Form.contextMenuEvent
            
            first_panel_left = QtWidgets.QVBoxLayout()
            first_panel_left.setAlignment(Qt.AlignTop)
            first_panel_frame_left = QtWidgets.QFrame()
            first_panel_frame_left.setMinimumWidth(200)
            first_panel_frame_left.setLayout(first_panel_left)
            first_panel_right = QtWidgets.QVBoxLayout()
            first_panel_right.addWidget(self.table_cubes)
            first_panel_right.addStretch()
            first_panel_frame_right = QtWidgets.QFrame()
            first_panel_frame_right.setLayout(first_panel_right)
            main_first_box = QtWidgets.QHBoxLayout()
            main_first_box.addWidget(first_panel_frame_left)
            main_first_box.addWidget(first_panel_frame_right)
            first_container = QtWidgets.QWidget()
            first_container.setLayout(main_first_box)
            self.stackedWidget.addWidget(first_container)
            self.stackedWidget.addWidget(label2)
            Form.setLayout(self.layout)
            
            
    class App(QtWidgets.QWidget):
        def __init__(self, parent = None):
            QtWidgets.QWidget.__init__(self, parent)
            self.ui = Ui_Form()
            self.ui.setupUi(self)
    
    # +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
            self.item = None
            self.ui.table_cubes.installEventFilter(self)                             # !!! 
            self.ui.table_cubes.setRowCount(3) 
            self.ui.table_cubes.setItem(0, 0, QtWidgets.QTableWidgetItem('Hello'))        
            self.ui.table_cubes.setItem(2, 0, QtWidgets.QTableWidgetItem('World'))          
    
        def eventFilter(self, source, event):
            if event.type() == QEvent.ContextMenu and source is self.ui.table_cubes:
                menu = QMenu()
                menu.addAction('Action 1')
                menu.addAction('Action 2')
                menu.addAction('Action 3')
    
                menu.triggered.connect(self.selected)                               
                        
                if menu.exec_(event.globalPos()):
                    self.item = source.itemAt(event.pos())
                return True
            return super().eventFilter(source, event)
            
        def selected(self, q):
            self.q = q.text()
            QTimer.singleShot(10, lambda: print(f'{self.item.text() if self.item else None}: {self.q}'))
    # +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        window = App()
        window.show()
        sys.exit(app.exec_())
    

    在此处输入图像描述

    • 3

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5