3

当弹出窗口以 PopupCompletion 模式显示时,我没有设法选择完成者的第一项。我当前不起作用的代码:

completer->setCompletionPrefix(text);
QItemSelectionModel* sm = new QItemSelectionModel(completer->completionModel());
sm->select(completer->completionModel()->index(0,0), QItemSelectionModel::Select);
completer->popup()->setSelectionModel(sm);

有什么建议么?

4

2 回答 2

2

我会尝试更改最后两行的顺序:

completer->popup()->setSelectionModel(sm);
sm->select(completer->completionModel()->index(0,0), QItemSelectionModel::Select);

发出 selectionChanged() 时,可能会更改弹出窗口(其视图)的选择。所以你必须先设置选择模型,然后进行选择。

void QItemSelectionModel::select ( const QModelIndex & index, QItemSelectionModel::SelectionFlags command ) [虚拟槽]

使用指定的命令选择模型项索引,并发出 selectionChanged()。

顺便说一句,您不必创建新的选择模型,只需询问弹出窗口即可(再次,它的视图):

完成者->popup()->selectionModel();

http://qt-project.org/doc/qt-5.0/qtwidgets/qabstractitemview.html#selectionModel

于 2013-07-22T09:59:35.133 回答
0

我不知道这是否是您想要的,但就我而言,我希望能够按 Enter 并自动选择弹出列表中的第一项(就像使用 UnfilteredPopupCompletion 一样)。对我有用的是:

class AutoSelectFirstFilter : public QObject
{
    Q_OBJECT

protected:
    virtual bool eventFilter(QObject *obj, QEvent *event) override
    {
        if (event->type() == QEvent::KeyPress)
        {
            if(static_cast<QKeyEvent *>(event)->key() == Qt::Key_Return)
            {
                QAbstractItemView* l = static_cast<QAbstractItemView*>(obj);
                QModelIndex i = l->model()->index(0,0);
                if(i.isValid())
                    l->selectionModel()->select(i, QItemSelectionModel::Select);
            }
        }
        return false;
    }
};

然后:

AutoSelectFirstFilter tmp;
completer->popup()->installEventFilter(&tmp);

PS:不要忘记重新运行 qmake。

于 2019-03-12T16:00:27.207 回答