我有一个QComboBox
,里面装满了一些数据。我希望编辑lineEdit
的comboBox
,当我这样做时,使comboBox
显示他的弹出,而我正在编辑。问题是我失去了lineEdit
的焦点,一次只能写一封信。
这就是我在一个微不足道的层面上所做的事情:
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中消失。
发布于 2016-12-20 08:50:28
您需要从QComboBox
派生自己的组合框类,并重写showPopup()
虚拟方法,以便将焦点返回到行编辑。
void CMyComboBox::showPopup()
{
QComboBox::showPopup();
// Put the focus back later, after all pending events are processed.
QTimer::singleShot(0, [this](){ lineEdit()->setFocus(); });
}
作为特例,在处理完窗口系统事件队列中的所有事件后,超时为0的QTimer将立即超时。
编辑:
这是可行的(尽管可以认为这是一次黑客攻击):
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
来显示单词列表,而不是组合框的弹出菜单。
发布于 2016-12-20 06:54:38
每个组合框都有一个默认的QCompleter
,可以在弹出窗口中显示完成选项。我认为您可以通过将此完成模式设置为PopupCompletion
来实现您想要的结果。
ui->comboBox->completer()->setCompletionMode(QCompleter::PopupCompletion);
在这种情况下,组合框将在键入时显示匹配的选择。如果您希望它列出combobox的所有项,我认为您应该实现一个自定义QCompleter,它匹配所有项目,而不管用户类型如何。
发布于 2021-01-07 05:28:54
您的问题是由grabKeyboard
引起的。键盘被弹出窗口抓取,所以解决方案很简单,只需使用grabKeyBoard()
将编辑设置为重新抓取键盘即可。
https://stackoverflow.com/questions/41236278
复制相似问题