2012-04-22 2 views
1

QPlainTextEdit가 포함 된 QTabWidget이 있습니다. QTabWidget에 작업을 추가하여 새 탭이 열릴 때마다 새 QPlainTextEdit도 새 탭에 추가되도록했습니다. 코드를 참조하십시오. 내가 헤더 파일의 기능을 추가 한이벤트/동작을 QPlainTextEdit에 연결하십시오.

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

:

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

주석으로 코드는 컴파일러 오류를 제공합니다.

헤더 파일 :

#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

오류 또는 단지 참조를 일으키는 실제 행을 주석 처리 했습니까? – 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 메커니즘을 사용하려고 시도 할 수있다 :이 경우 on_<member>_<signal>

, 즉 SLOT on_editor_cursorPositionChanged()의 현재 서명은 QPlainTextEdit editor 멤버와 일치합니다. 그런 다음 잘못된 서명으로 수동으로 문서에 연결합니다. 더 일반적으로 명명 된 다른 슬롯을 만들어야합니다. docCursorPosChanged(QTextCursor)

+0

Qt Creator에서 얻을 수있는 유일한 선택은 cursorPositionChanged (QTextCursor)입니다. – raze

+0

@raze : 실제로 연결을 잘못 읽었습니다. 편집자가 아니라 문서를 연결하고있는 것을 보았습니다. 방금 업데이트했습니다. 아마도 SLOT 서명이 잘못되었을 수도 있습니다. – jdi

+0

슬롯 이름을'onEditorCursorPositionChanged()'로 바꿨고 마술처럼 작동했습니다. 고마워요! – raze

관련 문제