qt - PyQt-QtableView header 。如何添加右上角的小按钮来隐藏/显示带有选中/未选中复选框的列?

标签 qt checkbox pyqt4 qtableview

对于 PyQt4,我使用的 QtableView 有超过 10 列。用户必须可以选择显示/隐藏列。

这通常是通过在表格标题的右上角添加一个小按钮来完成的。该按钮显示一个带有选中/未选中复选框的菜单,允许隐藏/显示列。

这是来自 Sqlite-Manager Table 的示例. 所以,我想知道如何用 PyQt 的 QtableView 做同样的事情?

谢谢,

最佳答案

谢谢 Kitsune Meyoko,这是个好主意..;)

我找到了另一个与您的解决方案非常相似的解决方案,即使用 QMenu 和 Checkable QActions 而不是 QPushButton:让我们开始吧:

import sys
import string
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Header(QHeaderView):

    def __init__(self, parent=None):
        super(Header, self).__init__(Qt.Horizontal, parent)

        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.ctxMenu)

        self.setup()

    @pyqtSlot(bool)
    def printID(self, i):
        print("id")
        if i == False:
            self.hideSection(0)
        else:
            self.showSection(0)

    @pyqtSlot(bool)        
    def printNAME(self, i):
        print("name")
        if i == False:
            self.hideSection(1)
        else:
            self.showSection(1)

    @pyqtSlot(bool)        
    def printUSERNAME(self, i):
        print("username")
        if i == False:
            self.hideSection(2)
        else:
            self.showSection(2)

    def setup(self):

        self.id = QAction("id",self)
        self.id.setCheckable(True)
        self.id.setChecked(True)
        self.connect(self.id, SIGNAL("triggered(bool)"), self, SLOT("printID(bool)"))


        self.name = QAction("name",self)
        self.name.setCheckable(True)
        self.name.setChecked(True)
        self.connect(self.name, SIGNAL("triggered(bool)"), self, SLOT("printNAME(bool)"))


        self.username = QAction("username",self)
        self.username.setCheckable(True)
        self.username.setChecked(True)
        self.connect(self.username, SIGNAL("triggered(bool)"), self, SLOT("printUSERNAME(bool)"))

    def ctxMenu(self, point):
        menu = QMenu(self)
        self.currentSection = self.logicalIndexAt(point)
        menu.addAction(self.id)
        menu.addAction(self.name)
        menu.addAction(self.username)
        menu.exec_(self.mapToGlobal(point))


class Table(QTableWidget):
    def __init__(self, parent=None):
        super(Table, self).__init__(parent)
        self.setHorizontalHeader(Header(self))
        self.setColumnCount(3)
        self.setHorizontalHeaderLabels(['id', 'name', 'username'])
        self.populate()

    def populate(self):
        self.setRowCount(10)
        for i in range(10):
            for j,l in enumerate(string.ascii_letters[:3]):
                self.setItem(i, j, QTableWidgetItem(l)) 

if __name__ == '__main__':
    app = QApplication(sys.argv)
    t = Table()
    t.show()
    app.exec_()
    sys.exit()

关于qt - PyQt-QtableView header 。如何添加右上角的小按钮来隐藏/显示带有选中/未选中复选框的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25744109/

相关文章:

c++ - Qt从控制台读取并按Enter停止

qt - ContainsMouse 在父更改时给出了错误的值

c++ - Qt 自动生成的表单提供了错误的源代码文件路径

PyQt4 setParent vs deleteLater

python qt,在另一个小部件(声子)上方显示文本/标签

html - 我想像网格一样对齐我的复选框

java - Wicket 6 设置 CheckGroup 的复选框默认未选中

javascript - 标记已更改的复选框的代码

Python 新手似乎无法正确子类化 PyQt4 小部件

python - 如何使 QLabel 的边框看起来像 QTreeWidget 等其他小部件的边框?