Matthias
Matthias

Reputation: 3566

Connecting signals and slots in a QTextEdit subclass?

I derived a class from QTextEdit and use it as a "logbook". I equipped it with a slot to receive log-messages.

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

};

another class then emits a signal like this:

// 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";

and also i connect the signal to the slot

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

However the message is never shown in the "logbook". What am i missing here?

SOLVED: The connect method was called after emitting the signal :-(

Upvotes: 2

Views: 3862

Answers (1)

phyatt
phyatt

Reputation: 19152

It is hard to see exactly what is wrong with your implementation without a full example. Sometimes signals or slots will fail if an object goes out of scope if it isn't initialized on the heap.

Another way that it could fail is if your QApplication hasn't reached the exec() call.

I haven't experimented with using const in signal and slot calls, and I haven't seen it in any examples before, so that could be causing the problem; but it seems to work fine in the example below.

Working Example With a Derived Class of QTextEdit

Screenshot of example

Here is a simple example I put together that does some basic logging with a push button and a line edit.

Here is the header:

#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

Here is the source:

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

And here is the main:

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

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

    return a.exec();
}

And here is the CLogBook class:

#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

Upvotes: 5

Related Questions