Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Павелъ от Сентябрь 12, 2015, 19:43



Название: QObject::connect: No such slot QTextEdit::append("Work!") in ../simply/main.cpp:
Отправлено: Павелъ от Сентябрь 12, 2015, 19:43
Доброго времени суток. Почему у меня коннект не создаётся.
Я хочу по нажатию на кнопку, чтобы текст добавлялся в текстовое поле.
А вместо этого ничего не происходит и вываливается вот это:
Код:
QObject::connect: No such slot QTextEdit::append("Work!") in ../simply/main.cpp:37

Вот сам код:

Код:
#include <QApplication>
#include <QTextEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>

int main(int argc,char ** argv)
{

    QApplication app(argc,argv);


    QTextEdit *txt = new QTextEdit;
    QPushButton *btn = new QPushButton("Нажми на меня");
    QVBoxLayout *vl = new QVBoxLayout;
    QVBoxLayout *lbtn = new QVBoxLayout;
    vl->addWidget(txt);
    lbtn->addWidget(btn);

    vl->addLayout(lbtn);
    lbtn->setAlignment(Qt::AlignCenter);

    btn->setFixedWidth(100);




    QWidget wgt;

    wgt.setLayout(vl);


    wgt.show();



QObject::connect(btn,SIGNAL(clicked(bool)),txt,SLOT(append("Work!")));

    return app.exec();
}

Что я делаю не так?


Название: Re: QObject::connect: No such slot QTextEdit::append("Work!") in ../simply/main.cpp:
Отправлено: gil9red от Сентябрь 12, 2015, 19:48
Потому-что в connect передается тип значений, а не сами значения. Для передачи самих значений в connect можно воспользоваться лябмдами.

В вашем случаи, можно в слоте передать функцию, в которой и будет вызываться append


Название: Re: QObject::connect: No such slot QTextEdit::append("Work!") in ../simply/main.cpp:
Отправлено: Павелъ от Сентябрь 12, 2015, 19:56
Потому-что в connect передается тип значений, а не сами значения. Для передачи самих значений в connect можно воспользоваться лябмдами.

В вашем случаи, можно в слоте передать функцию, в которой и будет вызываться append

А как это сделать. Такой вариант не прокатывает.

Код:
void my_append(QTextEdit *txt, QString str)
{
    txt->append(str);
}

Код:
QObject::connect(btn,SIGNAL(clicked(bool)),SLOT(my_append(txt,"Work!")));


Название: Re: QObject::connect: No such slot QTextEdit::append("Work!") in ../simply/main.cpp:
Отправлено: gil9red от Сентябрь 12, 2015, 22:51
Да нет же, типы параметров сигнала и слота, и их количество должно в connect совпадать.
И слот -- это метод наследника QObject, находящийся в группе slots

Минимально рабочий вариант:
Код
C++ (Qt)
#include <QWidget>
#include <QPushButton>
#include <QTextEdit>
#include <QVBoxLayout>
 
class Manager: public QWidget
{
   Q_OBJECT
 
   public:
       Manager() {
         QVBoxLayout * layout = new QVBoxLayout();
         layout->addWidget(&te);
         layout->addWidget(&pb);
         setLayout(layout);
 
         connect(&pb, SIGNAL(clicked()), this, SLOT(append()));
       }
 
   private:
       QTextEdit te;
       QPushButton pb;
 
   public slots:
       void append() {
           te.append("bla-bla");
       }
};
 
 


Название: Re: QObject::connect: No such slot QTextEdit::append("Work!") in ../simply/main.cpp:
Отправлено: Павелъ от Сентябрь 14, 2015, 16:48
Да нет же, типы параметров сигнала и слота, и их количество должно в connect совпадать.
И слот -- это метод наследника QObject, находящийся в группе slots


Спасибо, работает!