2012-04-22 8 views
1

QPlainTextEditを含むQTabWidgetがあります。 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()

Iは、ヘッダファイルに機能を追加しました。

ヘッダーファイル:

#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は名前照合することによって、あなたのSLOTにconnectSlotsByNameメカニズムを使用しようとすることができる。この場合on_<member>_<signal>

を、そのスロットon_editor_cursorPositionChanged()の現在の署名がQPlainTextEdit editorメンバーと一致します。そして、間違った署名を付けて文書を手動で接続しています。より一般的に名前が付けられた別のスロットを作成する必要があります。docCursorPosChanged(QTextCursor)

+0

私がQt Creatorから得られる唯一の妥当な選択肢は、cursorPositionChanged(QTextCursor)です。 – raze

+0

@raze:私は実際にあなたの接続を誤読しました。私はあなたがエディタではなくドキュメントに接続しているのを見ています。私はちょうど更新した。 SLOTシグネチャが間違っている可能性があります。 – jdi

+0

スロット名を 'onEditorCursorPositionChanged()'に変更しました。ありがとう! – raze