[PySide] simple QTableView example
Frank Rueter | OHUfx
frank at ohufx.com
Sun Oct 13 14:01:20 CEST 2013
aaah, clouds are slowly parting in my head :)
thanks!
On 13/10/13 1:16 PM, Sebastian Elsner wrote:
> This is correct. From the docs: Editable models need to implement
> setData
> <http://harmattan-dev.nokia.com/docs/library/html/qt4/qabstractitemmodel.html#setData>(),
> and implement flags
> <http://harmattan-dev.nokia.com/docs/library/html/qt4/qabstractitemmodel.html#flags>()
> to return a value containing Qt::ItemIsEditable
> <http://harmattan-dev.nokia.com/docs/library/html/qt4/qt.html#ItemFlag-enum>.
>
> http://stackoverflow.com/questions/11736560/edit-table-in-pyqt-using-qabstracttablemodel
>
>
> Am 13.10.2013 12:57, schrieb Frank Rueter | OHUfx:
>> Thanks Sebastian,
>>
>> I don't see en editor in this though, so the result for me in PySide
>> (after removing the QVariant references) is a static, non-ediablte
>> table.
>>
>>
>> On 13/10/13 12:43 AM, Sebastian Elsner wrote:
>>> Hi all,
>>>
>>> the approach I like most is described in this blog entry:
>>> http://www.saltycrane.com/blog/2007/06/pyqt-42-qabstracttablemodelqtableview/
>>>
>>> I think this is what you want.
>>>
>>> Cheers
>>>
>>> Sebastian
>>>
>>>
>>> Am 12.10.2013 22:49, schrieb Frank Rueter | OHUfx:
>>>> Is this the best way to do it though? I.e. having one item per
>>>> cell? s there another way at all?
>>>> I'm still a bit lost in the model/view design and can't find the
>>>> answer online.
>>>>
>>>> I'm simply trying to have each row represent a "task" with a
>>>> title/description (string), a status (boolean) and a priority
>>>> (integer). For the integer I need a spin box and for the boolean I
>>>> need a checkbox. The examples I found online all seem to be doing
>>>> something slightly different and often use different ways which
>>>> makes matters more confusing.
>>>>
>>>> Here is what I have at the moment:
>>>> http://pastebin.com/H3GD0xVB
>>>>
>>>> The "status" and "priority" values don't display currnelty as I
>>>> haven't figured out how to properly assign a delegate to just those
>>>> cells. At the top I tried to define a n item delegete for a spin
>>>> box but I'm not sure how to properly assign it.
>>>>
>>>> Do I have to make the delegate draw different widgets (spin box /
>>>> checkbox) depending on data type, or can/should I use a different
>>>> delegate for each cell?
>>>>
>>>> I'm sure the answer is right in front of me, could you please help
>>>> one more time please?!
>>>>
>>>> Cheers,
>>>> frank
>>>>
>>>>
>>>> On 11/10/13 4:00 PM, Tibold Kandrai wrote:
>>>>> If you mean to use a QStandardItem per cell then yes.
>>>>> Also for storing values that you want to display, use the
>>>>> Qt.DisplayRole as role.
>>>>>
>>>>> Cheers,
>>>>> Tibold Kandrai
>>>>> ------------------------------------------------------------------------
>>>>>
>>>>> From: Frank Rueter | OHUfx <mailto:frank at ohufx.com>
>>>>> Sent: ?11/?10/?2013 14:35
>>>>> To: Tibold Kandrai <mailto:kandraitibold at gmail.com>
>>>>> Cc: pyside at qt-project.org <mailto:pyside at qt-project.org>
>>>>> Subject: Re: [PySide] simple QTableView example
>>>>>
>>>>> one more silly question if I may:
>>>>> So if I have a task like this:
>>>>> newTask = {'title':'new task', 'priority':1, 'status':False}
>>>>>
>>>>> and need to store the data in one row in the model I should use
>>>>> three different items, one for each value, right?!
>>>>>
>>>>> e.g.:
>>>>>
>>>>> newTask = {'title':'new task', 'priority':1, 'status':False}
>>>>> row = self.model.rowCount()
>>>>> for column, attr in enumerate(['title', 'priority',
>>>>> 'status']):
>>>>> newItem = QtGui.QStandardItem(newTask[attr])
>>>>> self.model.setItem(row, column, newItem)
>>>>>
>>>>> then juggle delegates or widgets to use a spin box for the integer
>>>>> and a checkbox for the boolean...
>>>>>
>>>>> Thanks for the help!
>>>>>
>>>>> Cheers,
>>>>> frank
>>>>>
>>>>> On 10/10/13 11:44 PM, Tibold Kandrai wrote:
>>>>>> Hey,
>>>>>> I'm not sure I understand the problem correctly.
>>>>>> If you want to store data in a cell or a QStandardItem, then you
>>>>>> need to use setData() and data().
>>>>>> Generally you shouldn't need to subclass QStandardItem or
>>>>>> QStandardItemModel.
>>>>>> Here is an example how:
>>>>>> # Define roles
>>>>>> FINISHED_ROLE = QtCore.Qt.UserRole + 1
>>>>>> PRIORITY_ROLE = QtCore.Qt.UserRole + 2
>>>>>> # Create model
>>>>>> model = QtGui.QStandardItemModel()
>>>>>> item = QtGui.QStandarItem()
>>>>>> model.appendRow(item)
>>>>>> item_index = item.index()
>>>>>> # Store data using the item
>>>>>> item.setData(finished, FINISHED_ROLE)
>>>>>> item.setData(priority, PRIORITY_ROLE)
>>>>>> # Store data using the model
>>>>>> model.setData(item_index, finished, FINISHED_ROLE)
>>>>>> model.setData(item_index, priority, PRIORITY_ROLE)
>>>>>> # Retrieve data using the item
>>>>>> finished = item.data(FINISHED_ROLE)
>>>>>> priority = item.data(PRIORITY_ROLE)
>>>>>> # Retrieve data using the model
>>>>>> finished = model.data(item_index, FINISHED_ROLE)
>>>>>> priority = model.data(item_index, PRIORITY_ROLE)
>>>>>> In some cases like click event handlers, you have the model and
>>>>>> the item index, there it's easier to use the model methods
>>>>>> instead of finding the item and then getting the data. ?
>>>>>> Hope it helps.
>>>>>> Cheers,
>>>>>> Tibold
>>>>>> *From:* Frank Rueter | OHUfx
>>>>>> *Sent:* ?2013? ?October? ?10?, ?Thursday ?19?:?37
>>>>>> *To:* pyside at qt-project.org
>>>>>> After looking at some more examples I think my approach of
>>>>>> storing multiple values in one item is fundamentally flawed.
>>>>>> Instead I should be using one item per cell and assign the
>>>>>> respective data, right?!
>>>>>>
>>>>>> I shall re-write the example accordingly, sorry for the noise.
>>>>>>
>>>>>> frank
>>>>>>
>>>>>> On 10/10/13 6:34 PM, Frank Rueter | OHUfx wrote:
>>>>>>
>>>>>> I meant QTableView not QStandardTableView :/
>>>>>>
>>>>>> On 10/10/13 6:33 PM, Frank Rueter | OHUfx wrote:
>>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> after a bit of a break from PySide I am trying to wrap my
>>>>>> head around the model/view stuff again and am trying to
>>>>>> understand how a very simple example would work where a
>>>>>> QStandarItem has properties "title", "priority" and
>>>>>> "finished" which are displayed via a QStandardTableView.
>>>>>>
>>>>>> I am struggling with understanding how to properly display
>>>>>> the above three properties in the table's columns. I tried
>>>>>> setting the data() method on the model like this:
>>>>>>
>>>>>> / def data(self, index, role=QtCore.Qt.DisplayRole)://
>>>>>> // '''Return data based on index and role'''//
>>>>>> // item = self.itemFromIndex(index)//
>>>>>> // if index.column() == 0://
>>>>>> // return item.title//
>>>>>> // elif index.column() == 1://
>>>>>> // return item.finished//
>>>>>> // elif index.column() == 2://
>>>>>> // return item.priority/
>>>>>>
>>>>>> but for some reason it errors saying item does not have
>>>>>> attribute "finished" even though my item object s declared
>>>>>> like this:
>>>>>>
>>>>>> /class TaskItem(QtGui.QStandardItem)://
>>>>>> // '''Item to hold a task for the todo list'''//
>>>>>> ////
>>>>>> // def __init__(self, title, finished=False,
>>>>>> priority=1)://
>>>>>> // super(TaskItem, self).__init__(title)//
>>>>>> // self.title = title//
>>>>>> // self.finished = finished//
>>>>>> // self.priority = priority/
>>>>>>
>>>>>>
>>>>>> When printing the item's attributes via dir() I see that,
>>>>>> when the model is populated, the last item it attempts to
>>>>>> call is not my custom item object, but something else with
>>>>>> less attributes and methods. Clearly there is something I
>>>>>> haven't quite understood about this process.
>>>>>>
>>>>>> Also, if I use the models data() method as pointed out
>>>>>> above,
>>>>>> I get checkboxes in the cells which I don't want at this
>>>>>> stage.
>>>>>>
>>>>>> Can somebody please help me understand where I go wrong?
>>>>>> Attached is the whole test code.
>>>>>>
>>>>>> Cheers,
>>>>>> frank
>>>>>>
>>>>>> P.S.: I am aware that the controller code shouldn't
>>>>>> necessarily live in the QWidget's methods, this is just for
>>>>>> testing which I will clean up once I get how it all connects
>>>>>> again
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> PySide mailing list
>>>>>> PySide at qt-project.org
>>>>>> http://lists.qt-project.org/mailman/listinfo/pyside
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> PySide mailing list
>>>>>> PySide at qt-project.org
>>>>>> http://lists.qt-project.org/mailman/listinfo/pyside
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> PySide mailing list
>>>> PySide at qt-project.org
>>>> http://lists.qt-project.org/mailman/listinfo/pyside
>>>
>>>
>>>
>>> _______________________________________________
>>> PySide mailing list
>>> PySide at qt-project.org
>>> http://lists.qt-project.org/mailman/listinfo/pyside
>>
>>
>>
>>
>> _______________________________________________
>> PySide mailing list
>> PySide at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/pyside
>
>
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20131013/ffabacb8/attachment.html>
More information about the PySide
mailing list