2012-04-22 2 views
1

У меня есть QTabWidget, который содержит QPlainTextEdit. Мне удалось добавить действие в QTabWidget, так что всякий раз, когда открывается новая вкладка, на новой вкладке также добавляется новый QPlainTextEdit. См. Код.Подключить событие/действие к QPlainTextEdit

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

Закомментированный код дает ошибку компилятора:

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

я добавил функцию в файле заголовка.

Заголовок файла:

#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 
+0

Да, он определен в частных слотах в файле заголовка. – raze

+0

Это прокомментировано 'connect' фактическая строка, вызывающая ошибку или просто ссылку? – jdi

+0

Я не редактировал сообщение с полным кодом. Думаю, прокомментированная строка вызывает ошибку. Тем не менее, я все еще могу запустить приложение. – raze

ответ

1

Может быть, что ваша подпись для SLOT неправильно?

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

Должно быть?

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

Кроме того, соглашение об именовании, которое вы используете для этого слота, может быть конфликтующим с вашим ручным подключением. Qt может пытаться использовать connectSlotsByName механизм на вашем SLOT путем сопоставления имени: on_<member>_<signal>

В этом случае ток подпись этого SLOT on_editor_cursorPositionChanged() будет совпадать с QPlainTextEdit editor члена. И тогда вы вручную подключаете документ к нему с неправильной подписью. Вероятно, вы должны создать еще один слот, который называется более обычно docCursorPosChanged(QTextCursor)

+0

Единственный правильный выбор, который я получаю от Qt Creator, - это cursorPositionChanged (QTextCursor) ... – raze

+0

@raze: Я фактически неправильно читаю ваше соединение. Я вижу, что вы подключаете документ, а не редактор. Я просто обновился. Возможно, это неправильная подпись SLOT. – jdi

+0

Я изменил имя слота на 'onEditorCursorPositionChanged()', и он волшебным образом работал. Спасибо чувак! – raze

Смежные вопросы