[PySide] editing selected cells in QTabelWidget

Keith Kyzivat keith.kyzivat at qt.io
Fri Aug 26 16:38:48 CEST 2022


Hi Frank,

You should be able to suppress the single click deselect using an event filter.
You create (or use an existing) QObject that will receive all events that are sent to the QObject that you install the event filter on, and from that, you define an `eventFilter(obj: QObject, event: QEvent) -> bool` method on that which will do the event filtering.

From that method, you can look at the events type, looking for `QEvent.MouseButtonPress` or `QEvent.MouseButtonRelease` (not sure which is actually triggering the unselect), and just return `True` from the event filter in those cases. All other cases, you just return the parent’s implementation of eventFilter, passing the same object and event.

This way you achieve suppression of the mousePress and mouseRelease.

(I tried my best to translate these to Python, but these might not be 100% correct).

~Keith

From: PySide <pyside-bounces at qt-project.org> On Behalf Of Frank Rueter
Sent: Friday, August 26, 2022 3:05 AM
To: David Ching <dc at dcsoft.com>
Cc: pyside at qt-project.org
Subject: Re: [PySide] editing selected cells in QTabelWidget

So I made some progress but am now having the problem that a right click on a persistent editor (combo box) will lose the current table selection. I tried reimplementing the mousePressEvent on both the editor widget and the actual table widget to stop that behaviour but to no avail.
Here is a simplified version of the code that shows the problem:
https://pastebin.com/M9RSTFSJ
[cid:image001.png at 01D8B937.5E6EA900]
What I am trying to achieve is that a right click on the editor ithe "Type" column will keep the current row selection, so that I can then pop up the editor and apply the new value to all selected rows.

What am I missing?

Cheers,
frank

On Fri, Aug 26, 2022 at 7:58 AM Frank Rueter <frank at ohufx.com<mailto:frank at ohufx.com>> wrote:
Thanks David,
I was thinking about a right click option as a Plan B. Will do that.
I will look into using a delegate as well. I had forgotten I could use those with the TableWidget as well.

Thanks!
Frank


On Fri, Aug 26, 2022 at 4:52 AM David Ching <dc at dcsoft.com<mailto:dc at dcsoft.com>> wrote:
> Date: Thu, 25 Aug 2022 20:36:01 +1200
> From: Frank Rueter <frank at ohufx.com<mailto:frank at ohufx.com>>
> Subject: [PySide] editing selected cells in QTabelWidget
> Hi all,
>
> I have a simple table which will never hold much data, so I opted for
QTabelWidget rather than QTabelView.
> Two columns have combo boxes set as cell widgets; all other cells house
straight up strings.
>
> I have set the selection behaviour to QAbstractItemView.SelectRows and am
now trying to figure out how to enable
>  editing of selected cells, so that the user can select multiple rows,
then double click a cell in that selection and edit it,
>  which will cause all other cells in the same column within the selection
to receive the new value.
>
> I have hit a couple of issues:
>
>  1. By default the selection is reset when I double click in a cell, so I
   assume I will have to override QTableWidget.mousePressEvent() to prevent
   that somehow. Any suggestions on how to best manage that best? I am not
   sure what I need to re-implement to just prevent the selection being
reset.

In general, double clicking on a multiple selection doesn't work since as
you note, the first click (of the double click) selects the single item that
was clicked and de-selects the other items.  To edit multiple selected items
(my app runs on Windows) I select them and then start editing by pressing F2
(which Excel uses similarly) or a toolbar button, or right-clicking one of
the selected items which opens a context menu with an Edit item.


>   2. the cell widgets do not modify the actual cell item's value. Do I
>    need to manually connect the widgets to a slot that will do that or is
>    there a better way to do that?

I had a similar task:

MyTableWidget::MyTableWidget(QWidget *parent) : QTableWidget(parent)
{
    m_delegate = new MyTableItemDelegate();  // MyTableItemDelegate is
derived from QStyledItemDelegate
    setItemDelegate(m_delegate);
}

MyTableItemDelegate overrides createEditor(), setEditorData(),
setModelData(), updateEditorGeometry().

Apologies, this code is in C++.  It has been years since I developed this
code, so don't know more details off the top of my head.

Hope this helps,
David



_______________________________________________
PySide mailing list
PySide at qt-project.org<mailto:PySide at qt-project.org>
https://lists.qt-project.org/listinfo/pyside
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20220826/431664e6/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image001.png
Type: image/png
Size: 9971 bytes
Desc: image001.png
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20220826/431664e6/attachment-0001.png>


More information about the PySide mailing list