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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: СИГНАЛЫ/СЛОТЫ  (Прочитано 18329 раз)
Deni
Гость
« : Ноябрь 08, 2013, 00:10 »

Доброго времени суток!
Возникла проблема со слотом в функции void QConditioner::Start:
строка
Код:
connect(timer,SIGNAL(timeout()),this,SLOT(StartTimer(QRoom*)));
ошибка
Код:
QObject::connect: Incompatible sender/receiver arguments
        QTimer::timeout() --> QConditioner::StartTimer(QRoom*)

исходники
*.h
Код:
#ifndef QCONDITIONER_H
#define QCONDITIONER_H

#include <QtGui>
#include "qconditioner.h"
#include "qroom.h"

class QConditioner : public QObject
{
    Q_OBJECT
    int maxTemperature;
    int minTemperature;
    int supplyTemperature;
    bool Warming;
    bool Cooling;
    void setMinTemperature(int);
    void setMaxTemperature(int);
public:
    explicit QConditioner(QObject *parent = 0);

signals:
public slots:
    int getMaxTemperature();
    int getMinTemperature();
    void setSupplyTemperature(int);
    int getSupplyTemperature();
    void setWarming(bool);
    bool getWarming();
    void setCooling(bool);
    bool getCooling();
    void Start(QRoom*,int);
    void StartTimer(QRoom*);
    void Stop();
};

#endif // QCONDITIONER_H

*.cpp

Код:
#include "qconditioner.h"
QTimer *timer=new QTimer;
QConditioner::QConditioner(QObject *parent) :
    QObject(parent)
{
    maxTemperature=0;
    minTemperature=0;
    supplyTemperature=0;
    Warming=true;
    Cooling=true;
}
void QConditioner::setMinTemperature(int k){
    minTemperature=k;
}

void QConditioner::setMaxTemperature(int k){
    maxTemperature=k;
}

int QConditioner::getMaxTemperature(){
    return maxTemperature;
}

int QConditioner::getMinTemperature(){
    return minTemperature;
}

void QConditioner::setSupplyTemperature(int k){
    supplyTemperature=k;
}

int QConditioner::getSupplyTemperature(){
    return supplyTemperature;
}

void QConditioner::setWarming(bool k){
    if(k==true){
        Warming=k;
        Cooling=false;
        setMinTemperature(22);
        setMaxTemperature(28);
    }else{
        Warming=k;
        Cooling=true;
        setMinTemperature(15);
        setMaxTemperature(21);
    }
}

bool QConditioner::getWarming(){
    return Warming;
}

void QConditioner::setCooling(bool k){
    if(k==true){
        Warming=false;
        Cooling=k;
    }else{
        Warming=true;
        Cooling=k;
    }
}
bool QConditioner::getCooling(){
    return Cooling;
}
void QConditioner::Start(QRoom *room,int msec){
    timer->setParent(this);
    StartTimer(room);
    connect(timer,SIGNAL(timeout()),this,SLOT(StartTimer(QRoom*)));
    timer->start(msec);
}
void QConditioner::StartTimer(QRoom* room){
   room->setTemperature(room->getTemperature()+1);
}
void QConditioner::Stop(){
   timer->stop();
}
Помогите кто чем может)
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Ноябрь 08, 2013, 00:29 »

Явно же ошибка написана: QObject::connect: Incompatible sender/receiver arguments
Вот, что нам говорит документация:
Цитировать
The signals and slots mechanism is type safe: The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.) Since the signatures are compatible, the compiler can help us detect type mismatches.

Цитировать
connect(timer,SIGNAL(timeout()),this,SLOT(StartTimer(QRoom*)));
Непонятно, что вы вообще хотите сделать..а кто в StartTimer будет указатель на объект класс QRoom передавать?
Есть три варианта как исправить:
1) убрать параметр QRoom* из функции StartTimer
2) соединять сигнал timeout() с лямбда-функцией, которая будет вызывать StartTimer передавая туда нужный параметр (если Qt5)
3) соединить с другим слотом, который не принимает параметров и уже оттуда вызывать StartTimer передавая туда нужный параметр
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Deni
Гость
« Ответ #2 : Ноябрь 08, 2013, 00:47 »

вот как должна вызывается функция в mainwindow.cpp:

Код:
cond->Start(room,20);
qDebug()<<room->getTemperature();

1)Если я уберу параметр QRoom* из функции StartTimer я не смогу изменять экзэмпляр класса QRoom room, созданный  в mainwindow
2)Этот вариант не подходит
3)Тогда мне не понятно, как тогда передать параметр room, принятый в функции void QConditioner::Start
« Последнее редактирование: Ноябрь 08, 2013, 00:51 от Deni » Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Ноябрь 08, 2013, 00:58 »

>>Тогда мне не понятно, как тогда передать параметр room, принятый в функции void QConditioner::Start
Как вариант, сделать QRoom *m_room; приватным в QConditioner и потом его использовать.

Но если честно, то ваш нужно пересмотреть архитектуру.
И еще..нужно убрать connect из функции Start, т.к. при каждом вызове этой функции будет происходить коннект, т.е.  10 раз вызвали Start, 10 раз прошло соединение и соответственно 10 раз вызовется StartTimer после сигнала timeout().
Но лучше, как я и сказал продумать получше это все.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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