bobombe
bobombe

Reputation: 53

Always show a QComboBox in a cell of a QTableView

I have a QTableView with an associated model. I want to have a QComboBox in each cell of the third column.

I used a QItemDelegate as shown in this page : https://wiki.qt.io/Combo_Boxes_in_Item_Views. It works but the combo box is only shown after double clicking in the cell, the user has to click again to show the list of possible values. This is a bit inconvenient.

Is there a way to make the combo boxes always visible ?

I'm trying with openPersistentEditor method, but it does not work right now ...

there is a bit of code close to my code (ComboBoxItemDelegate is the same than the exemple linked before):

MonWidget::MonWidget() : _ui(new Ui::MonWidget())
{
    // ...

    // Links Model
    _linksModel = new QStandardItemModel(this);

    // Links Headers
    QStringList linksTableViewHeader  << "Name" << "Path" << "Version";
    _linksModel->setHorizontalHeaderLabels(linksTableViewHeader) ;

    // Create itemDelegate for linksView
    _itemDelegate = new ComboBoxItemDelegate(_ui->_linksView);

    // Set the links model on the links table view
    _ui->_linksView->setModel(_linksModel);
    _ui->_linksView->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
    _ui->_linksView->horizontalHeader()->setStretchLastSection(true);
    _ui->_linksView->horizontalHeader()->setMinimumSectionSize(100);
    _ui->_linksView->setSelectionBehavior(QAbstractItemView::SelectRows);
    _ui->_linksView->setItemDelegate(_itemDelegate);
}
// AddLinksInListView : method called when I add some rows ...
void MonWidget::AddLinksInListView(QList<DataItem*> listLinks)
{
    int j=0;
    int initialLinksNumber = _linksModel->rowCount();

    // For each link, add a row with the link information
    for (int row=initialLinksNumber; row<(initialLinksNumber + listLinks.size()) ; row++)
    {
        for (int column = 0; column < _linksModel->columnCount(); column++) {
            //item used to display information for each column in the table view of links contained in the collection
            QStandardItem *item=0;

            switch(column)
            {
                case MonWidget::NAME:
                {
                    item = new QStandardItem(listLinks.at(j)->data(MonWidget::NAME).toString());
                    _linksModel->setItem(row, column, item);
                    break;
                }
                case MonWidget::PATH:
                {
                    item = new QStandardItem(listLinks.at(j)->data(MonWidget::PATH).toString());
                    _linksModel->setItem(row, column, item);
                    break;
                }
                case MonWidget::VERSION:
                {
                    item = new QStandardItem(listLinks.at(j)->data(MonWidget::PATH).toString());
                    _linksModel->setItem(row, column, item);
                    _ui->_linksView->openPersistentEditor(_linksModel->index(row, column));
                    break;
                }
            }
        }
        j++;
    }
}

Upvotes: 3

Views: 3324

Answers (1)

IAmInPLS
IAmInPLS

Reputation: 4125

Yes, there is a way, using openPersistentEditor. Assuming your model is named myModel:

YourDelegate* comboDelegate = new YourDelegate(this);
setItemDelegateForColumn(2, comboDelegate); // delegate set for the third column

...
// when adding a new line, use this.
// The combo box will be always visible
openPersistentEditor(myModel->index(iRow, 1));

Upvotes: 2

Related Questions