我需要实现自定义完成符,类似于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
将事件转发到行编辑。这似乎工作得很好,除了行编辑中的光标不可见或不闪烁。
答案 0 :(得分:0)
只需将此方法应用于您的完成小部件:
setWindowFlags(Qt::Tool | Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
它对我有用。