gpt4 book ai didi

python - 如何获得 QTableView 标题中单击的右键单击上下文菜单?

转载 作者:太空狗 更新时间:2023-10-29 21:22:55 25 4
gpt4 key购买 nike

下面的示例代码(深受 here 的影响)有一个右键单击上下文菜单,当用户单击表格中的单元格时会出现该菜单。是否可以为表格标题中的右键单击设置不同的右键单击上下文菜单?如果是这样,我该如何更改代码以将其合并?

import re
import operator
import os
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def main():
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())

class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)

self.tabledata = [('apple', 'red', 'small'),
('apple', 'red', 'medium'),
('apple', 'green', 'small'),
('banana', 'yellow', 'large')]
self.header = ['fruit', 'color', 'size']

# create table
self.createTable()

# layout
layout = QVBoxLayout()
layout.addWidget(self.tv)
self.setLayout(layout)

def popup(self, pos):
for i in self.tv.selectionModel().selection().indexes():
print i.row(), i.column()
menu = QMenu()
quitAction = menu.addAction("Quit")
action = menu.exec_(self.mapToGlobal(pos))
if action == quitAction:
qApp.quit()

def createTable(self):
# create the view
self.tv = QTableView()
self.tv.setStyleSheet("gridline-color: rgb(191, 191, 191)")

self.tv.setContextMenuPolicy(Qt.CustomContextMenu)
self.tv.customContextMenuRequested.connect(self.popup)

# set the table model
tm = MyTableModel(self.tabledata, self.header, self)
self.tv.setModel(tm)

# set the minimum size
self.tv.setMinimumSize(400, 300)

# hide grid
self.tv.setShowGrid(True)

# set the font
font = QFont("Calibri (Body)", 12)
self.tv.setFont(font)

# hide vertical header
vh = self.tv.verticalHeader()
vh.setVisible(False)

# set horizontal header properties
hh = self.tv.horizontalHeader()
hh.setStretchLastSection(True)

# set column width to fit contents
self.tv.resizeColumnsToContents()

# set row height
nrows = len(self.tabledata)
for row in xrange(nrows):
self.tv.setRowHeight(row, 18)

# enable sorting
self.tv.setSortingEnabled(True)

return self.tv

class MyTableModel(QAbstractTableModel):
def __init__(self, datain, headerdata, parent=None, *args):
""" datain: a list of lists
headerdata: a list of strings
"""
QAbstractTableModel.__init__(self, parent, *args)
self.arraydata = datain
self.headerdata = headerdata

def rowCount(self, parent):
return len(self.arraydata)

def columnCount(self, parent):
return len(self.arraydata[0])

def data(self, index, role):
if not index.isValid():
return QVariant()
elif role != Qt.DisplayRole:
return QVariant()
return QVariant(self.arraydata[index.row()][index.column()])

def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return QVariant(self.headerdata[col])
return QVariant()

def sort(self, Ncol, order):
"""Sort table by given column number.
"""
self.emit(SIGNAL("layoutAboutToBeChanged()"))
self.arraydata = sorted(self.arraydata, key=operator.itemgetter(Ncol))
if order == Qt.DescendingOrder:
self.arraydata.reverse()
self.emit(SIGNAL("layoutChanged()"))

if __name__ == "__main__":
main()

最佳答案

结果比我想象的要简单。与我为 QTableView 小部件本身添加弹出菜单的方式相同,我可以只从表对象中获取标题,然后以与常规上下文菜单相同的方式附加上下文菜单。

headers = self.tv.horizontalHeader()
headers.setContextMenuPolicy(Qt.CustomContextMenu)
headers.customContextMenuRequested.connect(self.header_popup)

关于python - 如何获得 QTableView 标题中单击的右键单击上下文菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7782071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com