1

QTabWidgetQPlainTextEdit を含む があります。QTabWidget にアクションを追加して、新しいタブが開くたびに新しい 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: 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
4

1 に答える 1

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

また、そのスロットに使用している命名規則は、ここでは手動接続と競合している可能性があります。connectSlotsByNameQtは、名前を一致させることにより、SLOT のメカニズムを使用しようとしている可能性があります。on_<member>_<signal>

この場合、そのSLOTの現在の署名はon_editor_cursorPositionChanged()QPlainTextEditeditorメンバーと一致します。そして、間違った署名でドキュメントを手動で接続しています。おそらく、もっと普通の名前の別のスロットを作成する必要がありますdocCursorPosChanged(QTextCursor)

于 2012-04-22T18:07:06.167 に答える