Russian Qt Forum
Ноябрь 01, 2024, 04:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: сигналы и слоты.  (Прочитано 5344 раз)
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  есть....
Хелп плиз! Непонимающий
Записан
niXman
Гость
« Ответ #1 : Декабрь 28, 2009, 18:11 »

connect(qb, SIGNAL(clicked()),qte,SLOT(append(QString)));
Записан
Rcus
Гость
« Ответ #2 : Декабрь 28, 2009, 18:14 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 28, 2009, 18:14 »

Нет слота QTextEdit::append("TEST")
Есть слот QTextEdit::append(const QString &)

При коннекте нельзя использовать имена параметров и тем более константы. Можно только типы
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Декабрь 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)));
Записан
niXman
Гость
« Ответ #5 : Декабрь 28, 2009, 19:22 »

Цитировать
не заработает
дык...
почему?
Записан
anater
Гость
« Ответ #6 : Декабрь 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 и пр. здесь не сработают Грустный
Записан
niXman
Гость
« Ответ #7 : Декабрь 28, 2009, 19:32 »

тебе же ответили:
Цитировать
Документацию на connect() ты не прочитал принципиально?
что не так?
Записан
anater
Гость
« Ответ #8 : Декабрь 28, 2009, 19:50 »

тебе же ответили:
Цитировать
Документацию на connect() ты не прочитал принципиально?
что не так?
Все гут. Вот только появился вопрос как из слота достучаться на внешний объект?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Декабрь 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();
}
 

« Последнее редактирование: Декабрь 28, 2009, 19:55 от Alex Custov » Записан
anater
Гость
« Ответ #10 : Декабрь 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. Понятно что правильнее было бы и создавать их динамически.... Есть еще хорошие идеи? Может использовать заранее объявление контейнера?
« Последнее редактирование: Декабрь 28, 2009, 20:05 от anater » Записан
anater
Гость
« Ответ #11 : Декабрь 28, 2009, 21:10 »

В связи с динамичностью приложения использовал заранее объявленый безразмерный QList как вариант. Все заработало. Всем спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 23.