Russian Qt Forum
Мая 10, 2025, 19:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: сигналы и слоты.  (Прочитано 5530 раз)
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.235 секунд. Запросов: 23.