使用不同方法选择QComboBox中的项目后,光标行为不一致

问题描述 投票:0回答:1

我自定义了一个对话框,其中包含一个 QComboBox 控件

m_box
和一个 QListWidget 控件
m_lst
m_box
支持搜索匹配。如果直接用鼠标点击选择
m_box
的下拉列表中的一项,则
m_box
中不会显示光标,如下例所示。

enter image description here

如果使用上下键加回车键的搜索匹配方式选择

m_box
中的项目,
m_box
中也不会显示光标,如下例所示。

enter image description here

但是,如果通过搜索匹配显示匹配的项目,并用鼠标从下拉列表中选择项目,则光标将显示在

m_box
中,如下例所示。

enter image description here

我希望所有三种方法的行为一致:只要所选项目存在于

m_box
的候选项目中,光标就不应该显示在
m_box
中,除非鼠标单击
m_box
,此时光标应该出现。这是一个最小的可重现示例:

#include <QApplication>
#include <QDialog>
#include <QComboBox>
#include <QListWidget>
#include <QCompleter>
#include <QStringList>
#include <QVBoxLayout>
#include <QDebug>

class CustomDialog : public QDialog
{
    Q_OBJECT
public:
    CustomDialog(QWidget* parent = nullptr) : QDialog(parent)
    {
        QStringList items;
        items << "item1" << "item2";
        m_box = new QComboBox(this);
        m_box->setEditable(true);
        m_box->addItems(items);
        QCompleter* completer = new QCompleter(items, m_box);
        completer->setFilterMode(Qt::MatchContains);
        m_box->setCompleter(completer);

        m_lst = new QListWidget(this);
        m_lst->addItems(items);

        QVBoxLayout* layout = new QVBoxLayout(this);
        layout->addWidget(m_box);
        layout->addWidget(m_lst);

        connect(m_box, SIGNAL(activated(int)), this, SLOT(onSelChangedBox(int)));
    }

public slots:
    void onSelChangedBox(int iSel);

private:
    QComboBox* m_box;
    QListWidget* m_lst;
};

void CustomDialog::onSelChangedBox(int iSel)
{
    qDebug() << "clear focus of m_box";
    m_lst->setFocus();
}

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);

    CustomDialog dlg;
    dlg.setFixedSize(300, 200);
    dlg.show();

    return a.exec();
}

#include "main.moc"
c++ qt
1个回答
0
投票

我认为这可以通过将完成器的

activated
信号之一连接到你的槽函数来实现。然而,这些仅适用于
QModelIndex
QString
参数,因此有多种选择。

如果您不需要索引值,您可以将其从槽函数中删除,以使其与任何信号兼容。否则,您可以使用函数指针语法,如文档中所述:

connect(completer, QOverload<const QModelIndex &>::of(&QCompleter::activated),
    [=](const QModelIndex &index){ onSelChangedBox(index.row()); });

当然,它与另一个成员函数一起工作也一样好。

请注意,我自己还没有实际测试过这一点;请告诉我它是否有效。

© www.soinside.com 2019 - 2024. All rights reserved.