在QTableView的单元格中始终显示QComboBox

3
我有一个带有相关模型的QTableView。我希望在第三列的每个单元格中都有一个QComboBox。
我使用了一个QItemDelegate,如本页面所示:https://wiki.qt.io/Combo_Boxes_in_Item_Views。它可以工作,但是只有在双击单元格后才会显示下拉框,并且用户必须再次单击才能显示可能的值列表。这有点不方便。
有没有办法使下拉框始终可见?
我正在尝试使用openPersistentEditor方法,但现在它无法正常工作...
这里有一段与我的代码接近的代码(ComboBoxItemDelegate与前面链接的示例相同):
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++;
    }
}
1个回答

2

是的,有一种方法,使用openPersistentEditor。假设您的模型命名为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));

这看起来是我需要的,但它在我的代码中不起作用 :/ 我会提供一些代码,看看我是否做错了什么。 - bobombe
@bobombe 或许可以尝试使用setItemDelegateForColumn为特定的列设置委托。 - IAmInPLS
我也尝试过,在这两种情况下,itemDelegate 似乎是有效的,因为我可以在双击单元格后看到组合框... - bobombe
实际上,那个可以工作。我的问题是我没有直接使用 QTableView,而是我们项目的 QTableView 子类,它做了很多事情...我需要分析一下它... - bobombe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接