Как передать переменную виджета в слот?

Я новичок в QT и пишу приложение с графическим интерфейсом, в котором есть два QPushButton и два QTextEdits. Когда нажата кнопка 1, я хочу, чтобы только QTextEdit 1 что-то отображал, когда нажата кнопка 2, я хочу, чтобы только QTextEdit 2 что-то показывал, ниже мой код, но он не работает, потому что кажется, что я не могу передать параметры в слот метод ....

class EventProcessor: public QObject {

    Q_OBJECT

public slots:

    void PopulateEditTest(QTextEdit *textEdit, QString text)
    {
        textEdit->setText(text);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget *window = new QWidget;

    QTextEdit *result1 = new QTextEdit();
    QTextEdit *result2 = new QTextEdit();
    QPushButton *btFacility1 = new QPushButton("Facility 1");
    QPushButton *btFacility2 = new QPushButton("Facility 2");

    EventProcessor eventprocessor;


    QObject::connect(btFacility1, SIGNAL(clicked()), &eventprocessor, SLOT(PopulateEditTest
                    (result1, "textEdit1")));
    QObject::connect(btFacility2, SIGNAL(clicked()), result, SLOT(PopulateEditTest
                    (result2, "textEdit2")));

    ..........


    return app.exec();
}

Мне интересно, есть ли аналогичный способ заставить это работать? Спасибо за ваш ответ.


person Bi Wu    schedule 01.08.2013    source источник


Ответы (1)


Вы правы в том, что вы не можете указать аргументы для передачи в слот при вызове QObject::connect. Все, что вы предоставляете, - это определения функций, а не их вызовы.

Самый простой способ выполнить то, что вы пытаетесь сделать, - это добавить пару слотов в свой класс обработчика событий:

class EventProcessor: public QObject {

    Q_OBJECT

public slots:

    void PopulateEditTest(QTextEdit *textEdit, QString text) { ...  }
    void button1Clicked() {
        PopulateEditTest(dynamic_cast<QTextEdit*>(sender()), "textEdit1");
    }

    void button2Clicked() {
        PopulateEditTest(dynamic_cast<QTextEdit*>(sender()), "textEdit1");
    }
};

...

QObject::connect(btFacility1, SIGNAL(clicked()), &eventprocessor, SLOT(button1clicked()));
QObject::connect(btFacility2, SIGNAL(clicked()), &eventprocessor, SLOT(button2Clicked()));

Существуют различные причины, по которым использование функции QObject::sender() таким образом считается «злом», но это простейший способ выполнить то, что вы пытаетесь сделать, не переписывая весь свой код, что было бы бессмысленно мне. делать, не зная, каковы ваши долгосрочные цели.

person Chris    schedule 02.08.2013
comment
Привет, Крис. Спасибо за ваш ответ. Я пробовал ваш код, но он все равно не работает. Указывает ли отправитель в dynamic_cast ‹QTextEdit *› (sender ()) объект, который отправляет сигнал? в этом приложении кнопка? btFacility1 или btFacility2? - person Bi Wu; 03.08.2013
comment
Да sender() возвращает QObject * объекта, отправившего сигнал - person Chris; 04.08.2013
comment
Спасибо, Крис. Это очень полезно ... Таким образом я могу сэкономить много кода. - person Bi Wu; 12.08.2013