Сигналы и слоты Qt 4.0 с минимальным ООП - PullRequest
0 голосов
/ 07 апреля 2011

Я относительно новичок в Qt; Я пишу небольшую программу и не хочу создавать свои собственные классы для каждого виджета и тому подобное. До сих пор у меня не было много трудностей, но я немного запутался в сигналах и слотах. Я хочу сделать сигнал, который срабатывает, когда пользователь вводит в текстовое поле (QLineEdit) и нажимает ввод. Я бы предпочел, чтобы слот был функцией, принимающей текст, введенный пользователем.

Пока я придумал это:

textBox.connect(&textBox,SIGNAL(textBox.returnPressed()),/*What to put here?*/,processText(/*Here?*/))

Я прошу прощения, если этот кусок кода ужасно неправильно; как я уже сказал, я относительно новичок в Qt.

Помощь будет очень признателен.

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Сигналы и слоты должны быть методами объекта QObject (подкласс / QObject). Вы не можете использовать бесплатные функции в качестве слотов. «Минимальный ООП» здесь, вероятно, будет означать синглтон (ы) QObject, содержащий слоты.

Также сигнал с сигнатурой (A, B, C) можно подключать только к слотам с сигнатурами (), (A), (A, B), (A, B, C), то есть можно отбрасывать / игнорировать последние аргументы. Слот не может иметь больше / других аргументов, чем сигнал, и вы не можете привязать аргументы слота к определенному значению при соединении (где QSignalMapper покрывает наиболее распространенный вариант использования, я думаю).

0 голосов
/ 07 апреля 2011

К сожалению, я не думаю, что есть способ достичь этого без наследования - если вы хотите, чтобы текст сочетался с сигналом или выполнялась некоторая пользовательская обработка в вызываемом слоте.

Если нет, вы можете просто использовать сигнал «returnPressed», исходящий от QLineEdit, и какой-то ранее существовавший слот, который я не мог знать.

Вот мое решение с использованием наследования.

Чтобы создать свой собственный слот, вам нужно создать унаследованный класс. Унаследуйте это от Qobject, прямо или косвенно.

//myClass.h
#ifndef myclass_h_
#define myclass_h_
#include <QObject>

class myClass: public QObject
{
    // important
    Q_OBJECT;

    ....
    public slots:
        void takeText(QString p_value);
};

#endif

И чтобы получить такой сигнал от QLineEdit, вам также нужно что-то нестандартное

//myLineEdit.h
#ifndef mylineedit_h_
#define mylineedit_h_
#include <QLineEdit>

class myLineEdit: public QLineEdit
{
    // important
    Q_OBJECT;

    ....
    public slots:
        void handleReturnPressed();

    signals:
        void newText(QString p_value);
};

#endif

А потом сделай это

myLineEdit::myLineEdit()
{
    connect(this, returnPressed(),
            this, handleReturnPressed());
}

void myLineEdit::handleReturnPressed()
{
    emit(newText(text());
}

После этого создайте объект myClass и подключите к нему сигнал.

myClass * thing = new myClass();
myLineEdit* lineEdit = new myLineEdit();

connect(lineEdit, SIGNAL(newText(QString),
        things, SLOT(takeText(QString));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...