Russian Qt Forum

Qt => Общие вопросы => Тема начата: anater от Декабрь 28, 2009, 17:54



Название: сигналы и слоты.
Отправлено: anater от Декабрь 28, 2009, 17:54
Имеется код:
Код:
QTabWidget *qtw = new QTabWidget;
QTextEdit *qte = new QTextEdit;
QTextEdit *qte2 = new QTextEdit;

qtw->addTab(qte,"TEST");
qtw->addTab(qte2,"TEST2");

QString str=QString("TEST");

connect(qb, SIGNAL(clicked()),qte,SLOT(append("TEST")));

так вот при запуске пишет:
Object::connect: No such slot QTextEdit::append("TEST") in qarm.cpp:51

Хотя в доке такой слот у QTextEdit  есть....
Хелп плиз! ???


Название: Re: сигналы и слоты.
Отправлено: niXman от Декабрь 28, 2009, 18:11
connect(qb, SIGNAL(clicked()),qte,SLOT(append(QString)));


Название: Re: сигналы и слоты.
Отправлено: Rcus от Декабрь 28, 2009, 18:14
Нет такого слота, есть append(const QString&) /* или append(QString) в нормализованном виде*/. А то что вам нужно решается при помощи QSignalMapper в простых случаях и ручных слотов в более сложных.
вариант
Цитировать
connect(qb, SIGNAL(clicked()),qte,SLOT(append(QString)));
не заработает


Название: Re: сигналы и слоты.
Отправлено: Igors от Декабрь 28, 2009, 18:14
Нет слота QTextEdit::append("TEST")
Есть слот QTextEdit::append(const QString &)

При коннекте нельзя использовать имена параметров и тем более константы. Можно только типы


Название: Re: сигналы и слоты.
Отправлено: Alex Custov от Декабрь 28, 2009, 18:37
Имеется код:
...
Хелп плиз! ???

Документацию на connect() ты не прочитал принципиально?

Цитировать
Note that the signal and slots parameters must not contain any variable names, only the type. E.g. the following would not work and return false:

 // WRONG
 QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
                  label, SLOT(setNum(int value)));


Название: Re: сигналы и слоты.
Отправлено: niXman от Декабрь 28, 2009, 19:22
Цитировать
не заработает
дык...
почему?


Название: Re: сигналы и слоты.
Отправлено: anater от Декабрь 28, 2009, 19:30
Имеется код:
...
Хелп плиз! ???

Документацию на connect() ты не прочитал принципиально?

Цитировать
Note that the signal and slots parameters must not contain any variable names, only the type. E.g. the following would not work and return false:

 // WRONG
 QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
                  label, SLOT(setNum(int value)));
Ответы просто изумляют своей подробностью и наглядностью. Все написали как делать не надо. А как надо ничего конкретного.
Хорошо слия я сигнал в свой слот как тут подсказывали выше.
QTextEdit *qte = new QTextEdit;

qtw->addTab(qte,"TEST");



int qarm::usslot2(int param)
{

    qDebug() << "Test slot2 "  << param;
    return 0;

};

А как мне из слота теперь получить доступ к "QTextEdit *qte = new QTextEdit;" ??? qte->append и пр. здесь не сработают :(


Название: Re: сигналы и слоты.
Отправлено: niXman от Декабрь 28, 2009, 19:32
тебе же ответили:
Цитировать
Документацию на connect() ты не прочитал принципиально?
что не так?


Название: Re: сигналы и слоты.
Отправлено: anater от Декабрь 28, 2009, 19:50
тебе же ответили:
Цитировать
Документацию на connect() ты не прочитал принципиально?
что не так?
Все гут. Вот только появился вопрос как из слота достучаться на внешний объект?


Название: Re: сигналы и слоты.
Отправлено: Alex Custov от Декабрь 28, 2009, 19:50
А как мне из слота теперь получить доступ к "QTextEdit *qte = new QTextEdit;" ??? qte->append и пр. здесь не сработают :(

Это уже проблема дизайна, а не слотов. Чтобы в любом методе своего виджета получать доступ к любым своим переменным, надо эти переменные вынести в атрибуты класса.

Код
C++ (Qt)
class A : public QWidget
{
   Q_OBJECT
   A();
 
   private slots:
       void slot(int);
...
   private:
       QTextEdit *qte;
}
 
...
 
A:A() : QWidget()
{
   qte = new QTextEdit(this);
  ...
}
 
void A::slot(int p)
{
   qte->blabla();
}
 



Название: Re: сигналы и слоты.
Отправлено: anater от Декабрь 28, 2009, 20:01
А как мне из слота теперь получить доступ к "QTextEdit *qte = new QTextEdit;" ??? qte->append и пр. здесь не сработают :(

Это уже проблема дизайна, а не слотов. Чтобы в любом методе своего виджета получать доступ к любым своим переменным, надо эти переменные вынести в атрибуты класса.

Код
C++ (Qt)
class A : public QWidget
{
   Q_OBJECT
   A();
 
   private slots:
       void slot(int);
...
   private:
       QTextEdit *qte;
}
 
...
 
A:A() : QWidget()
{
   qte = new QTextEdit(this);
  ...
}
 
void A::slot(int p)
{
   qte->blabla();
}
 



Согласен нормальный вариант если бы не одно но... Все объекты у мене формируются динамически на основе вычитанного XML файла. Т.е. объектов может быть 1 а может 11. Понятно что правильнее было бы и создавать их динамически.... Есть еще хорошие идеи? Может использовать заранее объявление контейнера?


Название: Re: сигналы и слоты.
Отправлено: anater от Декабрь 28, 2009, 21:10
В связи с динамичностью приложения использовал заранее объявленый безразмерный QList как вариант. Все заработало. Всем спасибо!