Text from a QTableView's cell shows through inline QComboBox - OSX
-
wrote on 7 May 2021, 17:03 last edited by rpadrela 5 Aug 2021, 08:34
Hi,
I'm seeing an issue with a QComboBox in a QTableView letting the original value of the cell showing through as if the QComboBox is behind the table's cell.
Image of when the QComboBox is expanded - fine
Apart from this visual glitch, the QComboBox works as expected.
Qt's version is 6.0.3.
This is on Mac OS X 11.2.3. I haven't had the chance to test this on any other platforms.
Thank you.
-
Hi and welcome to devnet,
Are you calling setCellWidget ?
-
wrote on 8 May 2021, 08:36 last edited by
@SGaist If that's a method from the QTableWidget, then, nope. I'm not using a QTableWidget, I'm using a QTableView.
Btw, I have other types of delegates to embed other widgets (e.g. QSpinBox) in the table and those work fine. It's just the QComboBox that seems to have this problem.
-
Can you show the code of that delegate ?
-
wrote on 9 May 2021, 13:37 last edited by
@SGaist Sure.
class ComboBoxDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit ComboBoxDelegate(QObject* parent); ~ComboBoxDelegate() override = default; QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setEditorData(QWidget *editor, const QModelIndex &index) const override; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; }; ComboBoxDelegate::ComboBoxDelegate(QObject* parent) : QStyledItemDelegate(parent) { } QWidget* ComboBoxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { QComboBox* comboBox = new QComboBox(parent); comboBox->setModel(new ValueListModel(index)); return comboBox; } void ComboBoxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { qobject_cast<QComboBox*>(editor)->setCurrentText(index.data(Qt::EditRole).toString()); } void ComboBoxDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { model->setData(index, qobject_cast<QComboBox*>(editor)->currentText()); }
Thank you for looking into this.
-
wrote on 11 May 2021, 13:59 last edited by
Try adding:
public: void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const override{ editor->setGeometry(option.rect); }
-
Try adding:
public: void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const override{ editor->setGeometry(option.rect); }
-
wrote on 11 May 2021, 15:07 last edited by
this is very odd... do you have a custom stylesheet applyed?
-
@SGaist Sure.
class ComboBoxDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit ComboBoxDelegate(QObject* parent); ~ComboBoxDelegate() override = default; QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setEditorData(QWidget *editor, const QModelIndex &index) const override; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; }; ComboBoxDelegate::ComboBoxDelegate(QObject* parent) : QStyledItemDelegate(parent) { } QWidget* ComboBoxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { QComboBox* comboBox = new QComboBox(parent); comboBox->setModel(new ValueListModel(index)); return comboBox; } void ComboBoxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { qobject_cast<QComboBox*>(editor)->setCurrentText(index.data(Qt::EditRole).toString()); } void ComboBoxDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { model->setData(index, qobject_cast<QComboBox*>(editor)->currentText()); }
Thank you for looking into this.
wrote on 11 May 2021, 16:24 last edited by@rpadrela I feel there is some thing wrong here(not sure)
{ qobject_cast<QComboBox*>(editor)->setCurrentText(index.data(Qt::EditRole).toString()); }
Why are you setting the combo box text here?
Is it editable comboBox?
Set the comboBox setCurrentIndex here. If comboBox list of elements is set through model. -
@rpadrela I feel there is some thing wrong here(not sure)
{ qobject_cast<QComboBox*>(editor)->setCurrentText(index.data(Qt::EditRole).toString()); }
Why are you setting the combo box text here?
Is it editable comboBox?
Set the comboBox setCurrentIndex here. If comboBox list of elements is set through model.wrote on 11 May 2021, 16:27 last edited by VRonin 5 Nov 2021, 16:27@nagesh The current code is correct.
from https://doc.qt.io/qt-5/qcombobox.html#currentText-prop
The setter setCurrentText() simply calls setEditText() if the combo box is editable. Otherwise, if there is a matching text in the list, currentIndex is set to the corresponding index.
-
@rpadrela I feel there is some thing wrong here(not sure)
{ qobject_cast<QComboBox*>(editor)->setCurrentText(index.data(Qt::EditRole).toString()); }
Why are you setting the combo box text here?
Is it editable comboBox?
Set the comboBox setCurrentIndex here. If comboBox list of elements is set through model. -
@nagesh QComboBox is not editable.
Could this be an issue currently affecting Mac OS X only?
wrote on 11 May 2021, 17:32 last edited by VRonin 5 Nov 2021, 17:32@rpadrela said in Text from a QTableView's cell shows through inline QComboBox - OSX:
Could this be an issue currently affecting Mac OS X only?
On windows, both the windows style and Fusion work correctly with this delegate.
Could you try adding
QApplication::setStyle(QStyleFactory::create("Fusion"));
after you create theQApplication
in yourmain()
? and see if you still have the problem on Fusion? -
Did you test with 6.1 ?
From the looks of it's indeed macOS specific. IIRC there have been several glitches in the rendering of widgets with item views. -
@rpadrela said in Text from a QTableView's cell shows through inline QComboBox - OSX:
Could this be an issue currently affecting Mac OS X only?
On windows, both the windows style and Fusion work correctly with this delegate.
Could you try adding
QApplication::setStyle(QStyleFactory::create("Fusion"));
after you create theQApplication
in yourmain()
? and see if you still have the problem on Fusion? -
wrote on 12 May 2021, 08:20 last edited by
This means it's a bug in MacOS style, might be worth reporting it
-
wrote on 12 May 2021, 14:40 last edited by
@VRonin just reported it here https://bugreports.qt.io/browse/QTBUG-93731
Thank you everyone for your help.
9/17