首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QComboBox编辑LineEdit而PopUp处于活动状态

QComboBox编辑LineEdit而PopUp处于活动状态
EN

Stack Overflow用户
提问于 2016-12-20 06:39:52
回答 5查看 3.9K关注 0票数 1

我有一个QComboBox,里面装满了一些数据。我希望编辑lineEditcomboBox,当我这样做时,使comboBox显示他的弹出,而我正在编辑。问题是我失去了lineEdit的焦点,一次只能写一封信。

这就是我在一个微不足道的层面上所做的事情:

代码语言:javascript
运行
复制
ui->comboBox->addItem("This");
ui->comboBox->addItem("is");
ui->comboBox->addItem("a");
ui->comboBox->addItem("comboBox");

ui->comboBox->setEditable(true);
connect(ui->comboBox, SIGNAL(currentTextChanged(QString)), this, SLOT(PrintTextLineEdit(QString)));

void MainWindow::PrintTextLineEdit(QString str)
{
  ui->comboBox->showPopup();
  ui->comboBox->lineEdit()->setFocus();
}

另外,如果我在显示弹出时在lineEdit上使用lineEdit,则弹出是无用的。有什么建议吗?

编辑

看来我需要提供一些额外的细节。当我在ui->comboBox->showPopUp()信号中使用currentTextChanged时,我需要能够一次写一个完整的单词而不会失去焦点。

或者简单地说:在发出信号和显示QLineEdit之后,光标不需要从popUp中消失。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-12-20 08:50:28

您需要从QComboBox派生自己的组合框类,并重写showPopup()虚拟方法,以便将焦点返回到行编辑。

代码语言:javascript
运行
复制
void CMyComboBox::showPopup()
{
  QComboBox::showPopup();

  // Put the focus back later, after all pending events are processed.
  QTimer::singleShot(0, [this](){ lineEdit()->setFocus(); });
}

作为特例,在处理完窗口系统事件队列中的所有事件后,超时为0的QTimer将立即超时。

编辑:

这是可行的(尽管可以认为这是一次黑客攻击):

代码语言:javascript
运行
复制
class CMyComboBox : public QComboBox
{
  public:
    CMyComboBox(QWidget* parent) 
      : QComboBox(parent) 
    {
      view()->installEventFilter(this);
    }

    // Event filter forwards view key events to the line edit.
    bool eventFilter(QObject *watched, QEvent *event)
    {
      if (event->type() == QEvent::KeyPress)
      {
        QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
        QKeyEvent* newEvent = new QKeyEvent(keyEvent->type(), keyEvent->key(), keyEvent->modifiers(), 
                                            keyEvent->text(), keyEvent->isAutoRepeat(), keyEvent->count());

        QFocusEvent* focusEvent = new QFocusEvent(QEvent::FocusIn, Qt::OtherFocusReason);
        QCoreApplication::postEvent(lineEdit(), focusEvent);
        QCoreApplication::postEvent(lineEdit(), newEvent);
      }

      return false;
    }
};

但就我个人而言,我可能会使用单独的QMenu来显示单词列表,而不是组合框的弹出菜单。

票数 1
EN

Stack Overflow用户

发布于 2016-12-20 06:54:38

每个组合框都有一个默认的QCompleter,可以在弹出窗口中显示完成选项。我认为您可以通过将此完成模式设置为PopupCompletion来实现您想要的结果。

代码语言:javascript
运行
复制
ui->comboBox->completer()->setCompletionMode(QCompleter::PopupCompletion);

在这种情况下,组合框将在键入时显示匹配的选择。如果您希望它列出combobox的所有项,我认为您应该实现一个自定义QCompleter,它匹配所有项目,而不管用户类型如何。

票数 4
EN

Stack Overflow用户

发布于 2021-01-07 05:28:54

您的问题是由grabKeyboard引起的。键盘被弹出窗口抓取,所以解决方案很简单,只需使用grabKeyBoard()将编辑设置为重新抓取键盘即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41236278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档