C++ 如何更改QCompleter弹出列表的位置?
我正在开发一个基于Qt5的代码编辑器。当我尝试使用QCompleter向编辑器添加自动完成功能时,我发现弹出列表总是出现在编辑区域的底部。如何使它像真正的IDE一样在光标位置弹出 这是定义完成符的代码:C++ 如何更改QCompleter弹出列表的位置?,c++,qt,autocomplete,qt5,C++,Qt,Autocomplete,Qt5,我正在开发一个基于Qt5的代码编辑器。当我尝试使用QCompleter向编辑器添加自动完成功能时,我发现弹出列表总是出现在编辑区域的底部。如何使它像真正的IDE一样在光标位置弹出 这是定义完成符的代码: QCompleter*HintList=新的QCompleter(编辑区); //EditArea是QPlainTextEdit项 HintList->setFilterMode(Qt::MatchStartsWith); HintList->setCompletionMode(QComplet
QCompleter*HintList=新的QCompleter(编辑区);
//EditArea是QPlainTextEdit项
HintList->setFilterMode(Qt::MatchStartsWith);
HintList->setCompletionMode(QCompleter::PopupCompletion);
QStringListModel*KeyList=新QStringListModel(关键字,this);
//关键字是一个QStringList项目
HintList->setModel(键列表);
编辑区->设置完成器(HintList);
您可以通过对编辑器进行子类化来实现它。下面是使用QLineEdit
class ExtendedLineEdit : public QLineEdit
{
Q_OBJECT
public:
explicit ExtendedLineEdit(QWidget *parent = nullptr);
void setWordCompleter(QCompleter* c);
protected:
void keyPressEvent(QKeyEvent *e);
private slots:
void insertCompletionWord(const QString& txtComp);
private:
QCompleter* m_completerWord;
void showCustomCompleter(QCompleter* completer);
};
void ExtendedLineEdit::setWordCompleter(QCompleter *c)
{
m_completerWord = c;
m_completerWord->setWidget(this);
connect(m_completerWord, SIGNAL(activated(QString)),
this, SLOT(insertCompletionWord(QString)));
}
void ExtendedLineEdit::keyPressEvent(QKeyEvent *e)
{
QLineEdit::keyPressEvent(e);
if (!m_completerWord)
return;
m_completerWord->setCompletionPrefix(this->text());
showCustomCompleter(m_completerWord);
}
void ExtendedLineEdit::insertCompletionWord(const QString &txtComp)
{
setText(txtComp);
}
void ExtendedLineEdit::showCustomCompleter(QCompleter *completer)
{
if (completer->completionPrefix().length() < 1)
{
completer->popup()->hide();
return;
}
//HERE is calculated geometry of completer popup
QRect cr = cursorRect();
cr.setWidth(completer->popup()->sizeHintForColumn(0) + completer->popup()->verticalScrollBar()->sizeHint().width());
completer->complete(cr);
}
class ExtendedLineEdit:public QLineEdit
{
Q_对象
公众:
显式ExtendedLineEdit(QWidget*parent=nullptr);
void setWordCompleter(QCompleter*c);
受保护的:
无效按键事件(QKeyEvent*e);
专用插槽:
void insertCompletionWord(常量QString和txtComp);
私人:
QCompleter*m_completerWord;
void showcustompleter(QCompleter*completer);
};
void ExtendedLineEdit::setWordCompleter(QCompleter*c)
{
m_completerWord=c;
m_completerWord->setWidget(此);
连接(m_completerWord,信号(已激活(QString)),
这个插槽(insertCompletionWord(QString));
}
void ExtendedLineEdit::keyPressEvent(QKeyEvent*e)
{
QLineEdit::按键事件(e);
if(!m_completerWord)
返回;
m_completerWord->setCompletionPrefix(this->text());
showcustompleter(m_completterword);
}
void ExtendedLineEdit::insertCompletionWord(常量QString&txtComp)
{
setText(txtComp);
}
void ExtendedLineEdit::showcustompleter(QCompleter*completer)
{
if(completer->completionPrefix().length()<1)
{
完成符->弹出()->隐藏();
返回;
}
//这里是计算完成弹出的几何图形
QRect cr=cursorRect();
cr.setWidth(completer->popup()->sizeHintForColumn(0)+completer->popup()->verticalScrollBar()->sizeHint().width());
完成器->完成(cr);
}