Wie bekomme ich die Kontextmenüs der rechten Maustaste für Klicks in QTableView-header?
Dem folgenden Beispielcode (stark beeinflusst von hier) hat einen rechts-Klick Kontext-Menü, das angezeigt wird, wie der Benutzer auf die Zellen in der Tabelle. Ist es möglich, einen anderen mit der rechten Maustaste Kontext-Menü der rechten Maustaste in die Kopfzeile der Tabelle? Wenn ja, wie kann ich den code ändern zu übernehmen?
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()
InformationsquelleAutor c00kiemonster | 2011-10-16
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellte sich heraus, einfacher als ich dachte. In der gleichen Weise, wie ich hinzufügen das popup-Menü für die QTableView widget selbst, kann ich einfach die header aus Tabelle-Objekt und fügen dann ein Kontext-Menü in der gleichen Weise, wie ich es mit dem regelmäßigen Kontext-Menü.
Es ist eine andere potenziell mächtiger Weg, dies zu tun, wenn Sie den Schritt und übernehmen die Ansicht, anstatt einfach zu Komponieren ist es. Stellt benutzerdefinierte Kontextmenü-hier arbeiten? Ja, aber warum tut man nichts anderes als die Ansicht darüber wissen müssen? Es wird auch helfen, besser zu gestalten, Ihre code, um sich auch mit anderen Fragen richtig. Derzeit ist die Umsetzung bietet keine Kapselung, Kohäsion oder die Unterstützung von Trennung von Verantwortung. Am Ende werden Sie einen großen blob-das ist das Gegenteil von gutem design.
Ich erwähne dies, weil Sie scheinen zu sein, dass alle von der GUI-Logik in dieser ständig wachsenden main-Funktion und Ihre der Grund, warum Sie landete setzen die Art der Umsetzung in Ihrem Modell, das macht für mich keinen Sinn. (Was wenn Sie zwei Ansichten des Modells, Sie zu zwingen, die sortiert werden in der gleichen Weise)
Ist es mehr code? Ja, aber es gibt Ihnen mehr Energie, die ich denke, ist erwähnenswert. Unten bin ich demonstrieren, wie man mit den Kopf-und auch jede Zelle, die Sie wollen. Beachten Sie auch, dass in meiner Umsetzung, wenn einige ANDERE widgets vorhanden, die auch definiert, eine Kontext-Menü-Ereignishandler wird es möglicherweise eine chance bekommen zu haben, Riss an der Verarbeitung des Ereignisses nach mir; so dass, wenn jemand anderes fügt einen handler nur für bestimmte Fälle, können Sie dies tun, ohne komplizierende mein code. Teil dabei, ist die Markierung, wenn Sie das Ereignis behandelt wird oder nicht.
Genug von meinem Wander-und Gedanken hier der code:
pass
Befehle in den if-Anweisungen...