> 
>>> On Fri, Jun 11, 2021 at 10:05 AM Volker Hilsheimer 
>>> <volker.hilshei...@qt.io> wrote:
>>> > On 11 Jun 2021, at 13:52, Turtle Creek Software <supp...@turtlesoft.com> 
>>> > wrote:
>>> > 
>>> > Here's more info on the weird QTableWidget problem we're seeing.
>>> > 
>>> > One of our data entry fields uses combination of widgets:  a QLineEdit 
>>> > subclass with a linked QToolButton subclass next to it, and a QListWidget 
>>> > subclass that drops down underneath.  It acts kinda like a combo box, but 
>>> > better for really long lists. The whole assembly works properly in 
>>> > regular data entry screens.  Clicking on button or list changes values in 
>>> > the line edit field.
>>> > 
>>> > We use setCellWidget to put the same QLineEdit subclass into a 
>>> > QTableWidget cell. The button and list appear properly, but the button 
>>> > does not catch mouse clicks.  They go to the cell behind the button 
>>> > instead.
>>> > 
>>> > We use signals/slots to connect the clicked signal, but don't fiddle with 
>>> > events otherwise. 
>>> > 
>>> > Casey McD
>>> 
>>> 
>>> This works fine:
>>> 
>>> #include <QtWidgets>
>>> 
>>> class CellWidget : public QWidget
>>> {
>>> public:
>>>     CellWidget()
>>>     {
>>>         QLineEdit *le = new QLineEdit;
>>>         QToolButton *tb = new QToolButton;
>>>         QMenu *toolMenu = new QMenu;
>>>         toolMenu->addAction(new QAction("Action 1", this));
>>>         toolMenu->addAction(new QAction("Action 2", this));
>>>         toolMenu->addAction(new QAction("Action 3", this));
>>>         tb->setPopupMode(QToolButton::InstantPopup);
>>>         tb->setMenu(toolMenu);
>>> 
>>>         QHBoxLayout *hbox = new QHBoxLayout;
>>>         hbox->addWidget(le);
>>>         hbox->addWidget(tb);
>>>         setContentsMargins(0, 0, 0, 0);
>>>         hbox->setContentsMargins(0, 0, 0, 0);
>>> 
>>>         setLayout(hbox);
>>>     }
>>> 
>>>     QSize minimumSizeHint() const { return QSize(100, 100); }
>>> };
>>> 
>>> int main(int argc, char **argv)
>>> {
>>>     QApplication app(argc, argv);
>>> 
>>>     QTableWidget table(10, 10);
>>>     table.setCellWidget(5, 5, new CellWidget);
>>> 
>>>     table.show();
>>> 
>>>     return app.exec();
>>> }
>>> 
>>> 
>>> Volker
>> 
>> On 11 Jun 2021, at 17:51, Turtle Creek Software <supp...@turtlesoft.com> 
>> wrote:
>> 
>> If I understand this code correctly, it's putting the button inside the 
>> cell. Unfortunately, there isn't enough room to do that.
>> The table only shows the QLineEdits.  When you click in a cell to edit, the 
>> button appears next to it, over the neighboring cell(s).
>> However, maybe there is a container we can put the button into, that will 
>> act as a click barrier.  Something less extreme than a dialog.
>> Casey McD


Make sure you create whatever widget you create for editing cells either via an 
item delegate, e.g.

https://doc.qt.io/qt-5/qabstractitemdelegate.html#createEditor

But that’s not the same as using setCellWidget, and indeed, QTableView will 
want to fit the editor widget into the cell, and while you can set a minimum 
width to make the widget reach beyond the cell, that will not work great on the 
edge of the table.

If you do something completely custom, then make sure you create child widgets 
as children of the viewport() of QTableWidget, even if they are popups.


> On 11 Jun 2021, at 18:18, Turtle Creek Software <supp...@turtlesoft.com> 
> wrote:
> 
> I tried putting the button inside a QFrame, but it has the same problem.  
> Casey McD


Feel free to modify my example to show how and when you are setting up those 
widgets. Otherwise it’s unlikely that we’ll ever end up with the same 
configuration.

Volker


_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest

Reply via email to