Подключение сигналов и слотов в подклассе QTextEdit?

Я получил класс от QTextEdit и использую его как «журнал». Я оборудовал его слотом для приема лог-сообщений.

class CLogbook : public QTextEdit
{
   Q_OBJECT;
    public:
    void log(QString msg) {append(msg)};

    public slots:
    void recvLogSignal(const QString message)
    {    
         append("hallo");
         std::cout << "signal received.\n";    
         log(message);
    }

};

затем другой класс выдает такой сигнал:

// in the header
signals:
    void logMessage(const QString);

// in the implementation
    emit logMessage("qt is cute");
    std::cout << "if you can read this the logMessage was emitted\n";

а также я подключаю сигнал к слоту

connect(tableeditor, SIGNAL(logMessage(const QString)), logbook, SLOT(recvLogSignal(const QString)));

Однако сообщение никогда не отображается в «журнале». Что мне здесь не хватает?

РЕШЕНО: Метод подключения вызывался после подачи сигнала :-(


person Matthias    schedule 09.06.2012    source источник
comment
Вы видите одно из ваших cout сообщений?   -  person cmannett85    schedule 09.06.2012
comment
const передача по значению - это не обычный способ сделать что-то, есть ли причина, по которой вы это делаете?   -  person tmpearce    schedule 09.06.2012
comment
Вы хотели добавить приветствие к message или это другая функция?   -  person Anthony    schedule 09.06.2012
comment
@ cbamber85 я добавил сообщения cout при вводе кода для SO. Однако копирование их обратно в мою кодовую базу выявило решение: соединение было вызвано после подачи сигнала (ой)   -  person Matthias    schedule 10.06.2012
comment
@Anthony append является членом QTextEdit.   -  person Matthias    schedule 10.06.2012


Ответы (1)


Без полного примера трудно точно понять, что не так с вашей реализацией. Иногда сигналы или слоты не работают, если объект выходит за пределы области видимости, если он не инициализирован в куче.

Другой способ, который может привести к сбою, - это если ваше приложение QApplication не достигло вызова exec().

Я не экспериментировал с использованием const в вызовах сигналов и слотов, и я не видел его раньше ни в одном примере, так что это может быть причиной проблемы; но, похоже, в приведенном ниже примере это работает нормально.

Рабочий пример с производным классом QTextEdit

Скриншот примера

Вот простой пример, который я собрал, который выполняет базовое ведение журнала с помощью кнопки и редактирования строки.

Вот заголовок:

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>
//#include <QTextEdit>
#include "clogbook.h"
#include <QLineEdit>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget() {}
public slots:
    void on_pushButton();
    void on_lineEditReturn();
private:
    CLogBook * text_edit_log;
    QLineEdit * line_edit;
};

#endif // WIDGET_H

Вот источник:

#include "widget.h"

#include <QBoxLayout>
#include <QPushButton>
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QBoxLayout * box_layout = new QBoxLayout(QBoxLayout::TopToBottom);

    text_edit_log = new CLogBook;
    line_edit = new QLineEdit("Type Here and press Enter.");
    QPushButton * push_button = new QPushButton("Click to Add To Log");
    text_edit_log->setText("My Log Book");
    box_layout->addWidget(text_edit_log);
    box_layout->addWidget(line_edit);
    box_layout->addWidget(push_button);

    this->setLayout(box_layout);

    QObject::connect(push_button, SIGNAL(clicked()), this, SLOT(on_pushButton()));
    QObject::connect(line_edit, SIGNAL(returnPressed()), this, SLOT(on_lineEditReturn()));
}

void Widget::on_pushButton()
{
//    text_edit_log->append("Push Button Logging Test");
    text_edit_log->recvLogSignal("Push button test.");
}

void Widget::on_lineEditReturn()
{
//    text_edit_log->append(line_edit->text());
    text_edit_log->recvLogSignal(QString("LineEdit: ") + line_edit->text() );
    line_edit->clear();
}

И вот основное:

#include <QtGui/QApplication>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

А вот и класс CLogBook:

#ifndef CLOGBOOK_H
#define CLOGBOOK_H

#include <QTextEdit>
#include <iostream>

class CLogBook : public QTextEdit
{
    Q_OBJECT
public:
    explicit CLogBook(QWidget *parent = 0) : QTextEdit(parent) { }
    void log (QString msg) { append(msg); }

public slots:
    void recvLogSignal(const QString message)
    {
        append("hallo");
        std::cout << "signal received.\n" << std::endl;
        log(message);
    }

};

#endif // CLOGBOOK_H
person phyatt    schedule 09.06.2012
comment
Хороший. Но что делает ваше приложение Junk1? :) - person Arnold Spence; 09.06.2012
comment
@ArnoldSpence Я думаю, что это был один из моих самых известных постов несколько месяцев назад: stackoverflow.com/questions/7830054/ - person phyatt; 09.06.2012