实现自定义完成,弹出窗口窃取焦点

时间:2017-11-06 11:08:23

标签: c++ qt qt5

我需要实现自定义完成符,类似于QCompleter但包含自定义小部件。我一开始就陷入困境,我无法使弹出工作正常工作。在下面的示例中,我将完成符(好,只是一个简单的小部件)附加到第一行编辑。第二行编辑只是为了测试焦点进/出行为。问题是当弹出窗口显示时,它会从行编辑中窃取焦点。但这不是我想要的,我希望能够继续输入行编辑。我尝试了下面的代码中注释掉的其他几个选项,但没有它们起作用。

#include <QApplication>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget container;
    QLineEdit editor;
    QLineEdit editor2;
    QHBoxLayout layout(&container);
    layout.addWidget(&editor);
    layout.addWidget(&editor2);

    QWidget completer; // or QWidget completer(&editor);?
    //completer.setFocusProxy(&editor); // tried this, but it does not help
    completer.setWindowFlags(Qt::Popup);

    // the following lines are an alternative to Qt::Popup but the window
    // does not close automatically, which is a problem 
    // e.g. when moving or resizing the parent window
    //completer.setAttribute(Qt::WA_ShowWithoutActivating);
    //completer.setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);

    QObject::connect(&editor, &QLineEdit::textEdited,
         [&] {
                completer.resize(editor.width(), 100);
                completer.move(editor.mapToGlobal(QPoint(0, editor.height())));
                completer.show();
                // editor.setFocus(); // does not help either
             });

    container.show();
    return a.exec();
}

如何实施自定义完成者?

更新:从文档中,我读到了&#34;弹出窗口小部件是一个特殊的顶级窗口小部件,用于设置Qt :: WType_Popup窗口小部件标记,例如QMenu小部件。当应用程序打开弹出窗口小部件时,所有事件都将发送到弹出窗口。在弹出窗口小部件关闭之前,无法访问正常的窗口小部件和模态窗口小部件。&#34;

因此,当我打开弹出窗口时,它会自动接收事件,因此我必须使用QCoreApplication::sendEvent(editor, event);内的Completer::keyPressEvent将事件转发到行编辑。这似乎工作得很好,除了行编辑中的光标不可见或不闪烁。

1 个答案:

答案 0 :(得分:0)

只需将此方法应用于您的完成小部件:

setWindowFlags(Qt::Tool | Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);

它对我有用。