Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何更改QCompleter弹出列表的位置?_C++_Qt_Autocomplete_Qt5 - Fatal编程技术网

C++ 如何更改QCompleter弹出列表的位置?

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

我正在开发一个基于Qt5的代码编辑器。当我尝试使用QCompleter向编辑器添加自动完成功能时,我发现弹出列表总是出现在编辑区域的底部。如何使它像真正的IDE一样在光标位置弹出

这是定义完成符的代码:

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);
}