Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt: простейший пример модели QTableView [RSS Feed]

#1 Дек. 15, 2009 08:12:13

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt: простейший пример модели QTableView

SnowWolf
Тот пример не получится использовать когда моделью служит QAbstractTableModel.
Еще как получится :) Нужно лишь определить методы setData и flags
Вот, смотрите. В качестве редактора ячейки используйте, что душе угодно
# -*- coding: cp1251 -*-
from PyQt4 import QtGui, QtCore
import sys

class PushButtonDelegate(QtGui.QItemDelegate):
def __init__(self, parent):
QtGui.QItemDelegate.__init__(self, parent)
self.parent = parent
def paint(self, painter, option, index):
if index.column() == 1:
Option = QtGui.QStyleOptionButton()
Option.state = QtGui.QStyle.State_Enabled
Option.direction = QtGui.QApplication.layoutDirection();
Option.rect = option.rect;
Option.fontMetrics = QtGui.QApplication.fontMetrics();
Option.text = 'Button'
QtGui.QApplication.style().drawControl(QtGui.QStyle.CE_PushButton, Option, painter);
else:
QtGui.QItemDelegate.paint(self, painter, option, index)
def createEditor(self, parent, option, index):
editor = QtGui.QPushButton(parent)
return editor
def setEditorData(self, editor, index):
value = index.model().data(index, QtCore.Qt.EditRole).toString()
editor.setText(value)
def setModelData(self, editor, model, index):
value = editor.text()
model.setData(index, value, QtCore.Qt.EditRole)
def updateEditorGeometry(self, editor, option, index):
editor.setGeometry(option.rect)
class Model(QtCore.QAbstractTableModel):
def __init__(self, parent):
QtCore.QAbstractTableModel.__init__(self)
self.gui = parent
self.colLabels = ['Col1', 'Col2', 'Col3', 'Col4', 'Col5']
self.cached = [
['cell11','cell12','cell13','cell14','cell15',],
['cell21','cell22','cell23','cell24','cell25',],
['cell31','cell32','cell33','cell34','cell35',],
['cell41','cell42','cell43','cell44','cell45',],
['cell51','cell52','cell53','cell54','cell55',],
['cell61','cell62','cell63','cell64','cell65',],
['cell71','cell72','cell73','cell74','cell75',],
['cell81','cell82','cell83','cell84','cell85',],
]
def rowCount(self, parent):
return len(self.cached)
def columnCount(self, parent):
return len(self.colLabels)
def data(self, index, role):
if not index.isValid():
return QtCore.QVariant()
elif role != QtCore.Qt.DisplayRole and role != QtCore.Qt.EditRole:
return QtCore.QVariant()
value = ''
if role == QtCore.Qt.DisplayRole:
row = index.row()
col = index.column()
value = self.cached[row][col]
elif role == QtCore.Qt.EditRole:
row = index.row()
col = index.column()
value = self.cached[row][col]
return QtCore.QVariant(value)
def flags(self, index):
if not index.isValid():
return QtCore.Qt.ItemIsEnabled
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable
def setData(self, index, value, role):
if index.isValid() and role == QtCore.Qt.EditRole:
self.cached[index.row()][index.column()] = QtCore.QVariant(value)
self.emit(QtCore.SIGNAL("dataChanged(QModelIndex, QModelIndex)"), index, index)
return True
else:
return False
def headerData(self, section, orientation, role):
if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
return QtCore.QVariant(self.colLabels[section])
return QtCore.QVariant()

class MainWindow(QtGui.QMainWindow):
def __init__(self, parent):
QtGui.QMainWindow.__init__(self, parent)
self.table = QtGui.QTableView(self)
self.table.setAlternatingRowColors(True)
self.model = Model(self.table)
self.table.setModel(self.model)
self.delegate = PushButtonDelegate(self.model)
self.table.setItemDelegate(self.delegate)
self.setCentralWidget(self.table)

class App(QtGui.QApplication):
def __init__(self, argv):
QtGui.QApplication.__init__(self, argv)
self.ui = MainWindow(None)
self.ui.show()

if __name__ == "__main__":
app = App(sys.argv)
sys.exit(app.exec_())



Офлайн

#2 Дек. 15, 2009 20:55:15

SnowWolf
От:
Зарегистрирован: 2009-12-11
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt: простейший пример модели QTableView

hellslade
Еще как получится smile Нужно лишь определить методы setData и flags
Спасибо.
Пример paint сам хотел сегодня вечером написать.
Но это все же не то. Методом paint изменяется вид ячейки, с помощью изменения стиля. Но она не становится кнопкой, а выглядит как кнопка. Это можно заметить когда нажать на нее, она не будет реагировать на нажатие. И подозреваю сигнала она тоже никакого послать не сможет.
Метод createEditor переопределяет редактор для ячейки. Он как раз и отображает полноценную кнопку, но после начала редактирования (например двойного клика), что опять же не подходит.
И еще, как здесь плюсики ставить?



Офлайн

#3 Дек. 16, 2009 08:33:21

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt: простейший пример модели QTableView

SnowWolf
Но она не становится кнопкой, а выглядит как кнопка. Это можно заметить когда нажать на нее, она не будет реагировать на нажатие. И подозреваю сигнала она тоже никакого послать не сможет
Ну так нарисуйте настоящую кнопку поверх ячейки :)



Офлайн

  • Начало
  • » GUI
  • » PyQt: простейший пример модели QTableView[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version