Tôi đang cố gắng hiển thị hộp tổ hợp trong bảng của mình, để tôi có thể đặt chỉ mục đã chọn từ mô hình bảng, như với các ô khác trong bảng. Tôi đã ghép nối chúng lại với nhau từ các ví dụ khác nhưng vẫn không thể hiểu cách tương tác hoạt động để thiết lập chỉ mục đã chọn của QComboBox.PyQt - Cách đặt QComboBox ở chế độ xem bảng bằng cách sử dụng QItemDelegate
Đây là ví dụ đơn giản nhất mà tôi có thể đưa ra để minh họa sự cố. Nếu có ai có thể chứng minh làm thế nào để thiết lập chỉ mục tự động từ dữ liệu mô hình? Ngoài ra làm thế nào để sử dụng tín hiệu 'currentIndexChanged', vì điều này dường như cháy gần như liên tục bất cứ khi nào nó được sơn lại? Cảm ơn.
# The following tells SIP (the system that binds Qt's C++ to Python)
# to return Python native types rather than QString and QVariant
import sip
sip.setapi('QString', 2)
sip.setapi('QVariant', 2)
from PyQt4 import QtCore, QtGui
class TableModel(QtCore.QAbstractTableModel):
"""
A simple 5x4 table model to demonstrate the delegates
"""
def rowCount(self, parent=QtCore.QModelIndex()): return 5
def columnCount(self, parent=QtCore.QModelIndex()): return 4
def data(self, index, role=QtCore.Qt.DisplayRole):
if not index.isValid(): return None
if not role==QtCore.Qt.DisplayRole: return None
return "{0:02d}".format(index.row())
class ComboDelegate(QtGui.QItemDelegate):
"""
A delegate that places a fully functioning QComboBox in every
cell of the column to which it's applied
"""
def __init__(self, parent):
QtGui.QItemDelegate.__init__(self, parent)
def paint(self, painter, option, index):
self.combo = QtGui.QComboBox(self.parent())
self.connect(self.combo, QtCore.SIGNAL("currentIndexChanged(int)"), self.parent().currentIndexChanged)
li = []
li.append("Zero")
li.append("One")
li.append("Two")
li.append("Three")
li.append("Four")
li.append("Five")
self.combo.addItems(li)
if not self.parent().indexWidget(index):
self.parent().setIndexWidget(
index,
self.combo
)
class TableView(QtGui.QTableView):
"""
A simple table to demonstrate the QComboBox delegate.
"""
def __init__(self, *args, **kwargs):
QtGui.QTableView.__init__(self, *args, **kwargs)
# Set the delegate for column 0 of our table
# self.setItemDelegateForColumn(0, ButtonDelegate(self))
self.setItemDelegateForColumn(0, ComboDelegate(self))
@QtCore.pyqtSlot()
def currentIndexChanged(self, ind):
print "Combo Index changed {0} {1} : {2}".format(ind, self.sender().currentIndex(), self.sender().currentText())
if __name__=="__main__":
from sys import argv, exit
class Widget(QtGui.QWidget):
"""
A simple test widget to contain and own the model and table.
"""
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
l=QtGui.QVBoxLayout(self)
self._tm=TableModel(self)
self._tv=TableView(self)
self._tv.setModel(self._tm)
l.addWidget(self._tv)
a=QtGui.QApplication(argv)
w=Widget()
w.show()
w.raise_()
exit(a.exec_())
Tôi đã thêm một câu hỏi theo dõi về mô hình dữ liệu [ở đây] (http://stackoverflow.com/questions/17697352/pyqt-implement-a-qabstracttablemodel -for-display-in-qtableview) thay vì mở rộng câu hỏi này quá nhiều. – drexiya
Ngoài ra một câu hỏi tiếp theo [tại đây] (http://stackoverflow.com/questions/17748546/pyqt-column-of-checkboxes-in-a-qtableview) về việc thêm một cột hộp kiểm vào chế độ xem. – drexiya