raze
raze

Reputation: 702

Connect event/action to QPlainTextEdit

I have a QTabWidget which contains a QPlainTextEdit. I have managed to add action to the QTabWidget so that whenever a new tab opens, a new QPlainTextEdit is also added in the new tab. See code.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPlainTextEdit>
#include <QMessageBox>
#include <QAction>
#include <QTextCursor>
#include <iostream>
#include <QKeyEvent>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("Tilde");
    current_tab = 1;
    on_action_New_triggered();
    ui->tabWidget->setTabsClosable(true);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_action_New_triggered()
{
    QString newTab = "Tab " + QString::number(current_tab);
    ui->tabWidget->addTab(new QPlainTextEdit, newTab);
    ui->tabWidget->setCurrentIndex(current_tab - 1);
    current_tab++;
    editor = qobject_cast<QPlainTextEdit *>(ui->tabWidget->currentWidget());
    editor->setFocus();
    /*connect(editor->document(), SIGNAL(cursorPositionChanged(QTextCursor)),
            this, SLOT(on_editor_cursorPositionChanged()));*/
}

void MainWindow::on_actionNew_document_triggered()
{
    on_action_New_triggered();
}

void MainWindow::on_action_Exit_triggered()
{
    QMessageBox msg;
    msg.addButton(QMessageBox::Yes);
    msg.addButton(QMessageBox::No);
    msg.setText("Exit program?");

    int selection = msg.exec();

    if (selection == QMessageBox::Yes)
        qApp->exit(0);
}

// highlight current line
void MainWindow::on_editor_cursorPositionChanged()
{
    QTextEdit::ExtraSelection highlight;
    highlight.cursor = editor->textCursor();
    highlight.format.setProperty(QTextFormat::FullWidthSelection, true);
    highlight.format.setBackground( QColor(240, 246, 217) );

    QList<QTextEdit::ExtraSelection> extras;
    extras << highlight;
    editor->setExtraSelections(extras);
}

The commented code gives compiler error:

QMetaObject::connectSlotsByName: No matching signal for on_editor_cursorPositionChanged()

I have added the function in the header file.

Header file:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPlainTextEdit>
#include <QTextCursor>

namespace Ui
{
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_action_New_triggered();
    void on_actionNew_document_triggered();
    void on_action_Exit_triggered();
    void on_editor_cursorPositionChanged();

private:
    Ui::MainWindow *ui;
    QPlainTextEdit *editor;
    qint8 current_tab;
};

#endif // MAINWINDOW_H

Upvotes: 1

Views: 1220

Answers (1)

jdi
jdi

Reputation: 92569

Could it be that your signature for the SLOT is wrong?

/*connect(editor->document(), SIGNAL(cursorPositionChanged(QTextCursor)),
            this, SLOT(on_editor_cursorPositionChanged()));*/

Should be?

connect(editor->document(), SIGNAL(cursorPositionChanged(QTextCursor)),
            this, SLOT(on_editor_cursorPositionChanged(QTextCursor)));

Also, the naming convention you are using for that slot might be conflicting here with your manual connection. Qt may be trying to use the connectSlotsByName mechanism on your SLOT by matching the name: on_<member>_<signal>

In this case, the current signature of that SLOT on_editor_cursorPositionChanged() would match with the QPlainTextEdit editor member. And then you are manually connecting the document to it with the wrong signature. You probably should create another slot that is named more normally docCursorPosChanged(QTextCursor)

Upvotes: 1

Related Questions