KeyPressEvent doesn't work with Qscintilla Library (Qt)

泪湿孤枕 提交于 2019-12-25 09:19:44

问题


EDIT : THE CODE IS THE RIGHT CODE, FOR MORE EXPLANATION LOOK IN COMMENTS ;)

I'm trying to do an auto completer for parenthesis with Qt and Qscintilla library but i don't know why, my program wont goes into keyPressEvent function.

#include "mainwindow.h"
#include <QMenuBar>
#include <QFileDialog>
#include <Qsci/qscilexerhtml.h>

#include <QKeyEvent>
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    initializeUI();
    initializeEditor();

    editor->installEventFilter(this);
}

MainWindow::~MainWindow()
{

}

void MainWindow::initializeUI()
{
    setWindowTitle("My Code Editor");
    setMenuBar(new QMenuBar(this));
    QMenu *fileMenu = menuBar()->addMenu("&File");
    fileMenu->addAction("&Open", this, SLOT(onOpen()), QKeySequence::Open);
    editor = new QsciScintilla(this);
    setCentralWidget(editor);
}

void MainWindow::onOpen()
{
    QString filename =  QFileDialog::getOpenFileName(this, tr("Open .html file"),
                                                     QDir::currentPath(),
                                                    "HTML (*.html *.css *.php)");

    if (filename.isEmpty())
        return;

    QFile file(filename);
    if (!file.open(QIODevice::ReadOnly))
        return;

    editor->setText(file.readAll());
    file.close();
}

void MainWindow::initializeEditor()
{
    initializeFont();
    initializeMargin();
    initializeCaretLine();
    initializeLexer();

    initializeFolding();
}

void MainWindow::initializeFont()
{
    QFont font("Consolas", 12);
    font.setFixedPitch(true);
    editor->setFont(font);
}

void MainWindow::initializeMargin()
{
    QFontMetrics fontmetrics = QFontMetrics(editor->font());
    editor->setMarginsFont(editor->font());
    editor->setMarginWidth(0, fontmetrics.width(QString::number(editor->lines())) + 6);
    editor->setMarginLineNumbers(0, false);
    editor->setMarginsBackgroundColor(QColor("#cccccc"));

    connect(editor, SIGNAL(textChanged()), this, SLOT(onTextChanged()));
}

void MainWindow::onTextChanged()
{
    QFontMetrics fontmetrics = editor->fontMetrics();
    editor->setMarginWidth(0, fontmetrics.width(QString::number(editor->lines())) + 6);
}

void MainWindow::initializeLexer()
{
    QsciLexerHTML *lexer = new QsciLexerHTML();
    lexer->setDefaultFont(editor->font());
    //lexer->setFoldComments(true);
    editor->setLexer(lexer);
}

void MainWindow::initializeCaretLine()
{
    editor->setCaretLineVisible(true);
    editor->setCaretLineBackgroundColor(QColor("#ffe4e4"));
}

void MainWindow::initializeFolding()
{
    QsciScintilla::FoldStyle state = static_cast<QsciScintilla::FoldStyle>((!editor->folding()) * 5);

    if (!state)
        editor->foldAll(false);

    editor->setFolding(state);
}


bool MainWindow::eventFilter(QObject *obj, QEvent *e)
{
    if(e->type() == QEvent::KeyPress) {
    QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);

    switch (keyEvent->key()) {
    case 40:
        editor->insert("()");
        break;
    case 60:
        editor->insert("<>");
        break;
    default:
        return QObject::eventFilter(obj, e);
    }

    return true;
}

return QObject::eventFilter(obj, e);
}

And there is my header file :

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <Qsci/qsciscintilla.h>
#include <QTextEdit>
#include <QString>
#include <map>

class MainWindow : public QMainWindow
{
   Q_OBJECT

public:
   MainWindow(QWidget *parent = 0);
   ~MainWindow();
   void initializeUI();
   void initializeEditor();
   void initializeLexer();
   void initializeFolding();
   void initializeMargin();
   void initializeCaretLine();
   void initializeFont();

protected:
   bool eventFilter(QObject *obj, QEvent *e);

public slots:
   void onTextChanged();
   void onOpen();

private:
   QsciScintilla *editor;
};

#endif // MAINWINDOW_H

When I use keyPressEvent function without Qscintilla Library that work fine but not here.

If someone can help me, that will be a pleasure :)

来源:https://stackoverflow.com/questions/40706002/keypressevent-doesnt-work-with-qscintilla-library-qt

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!