crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Передача указателя на QTimer в качестве параметра в функцию
Гость_oneassasin_*
сообщение 13.4.2011, 17:40
Сообщение #1





Гости








    


Здравствуйте. На следующий код:
void DigitalClock::startTimer()
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(showMessage(QTimer *timer)));
    timer->start(60000););
}

мне Qt Creator подчеркнул желтой линией и написал "argument should be anonymous".
Что такое и как это можно исправить?
p.s.
SLOT(showMessage(QTimer *timer))

Подобное вообще возможно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 13.4.2011, 18:04
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


может так:
...
connect(switchTimer,SIGNAL(timeout()),this,SLOT(messege()));
...

void DigitalClock::messege()
{
showMessage(...);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
quarz
  опции профиля:
сообщение 13.4.2011, 18:20
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 3.11.2009
Пользователь №: 1202

Спасибо сказали: 5 раз(а)




Репутация:   0  


В SIGNAL() и SLOT() обычно не указывают имена аргументов, только их типы. Возможно Creator хотел сказать именно это.
Попробуй так:
connect(timer, SIGNAL(timeout()), this, SLOT(showMessage(QTimer*)));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.4.2011, 18:37
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(quarz @ 13.4.2011, 21:20) *
В SIGNAL() и SLOT() обычно не указывают имена аргументов
не обычно, а в обязательном порядке, иначе moc их не поймёт
Описание функции connect()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_oneassasin_*
сообщение 13.4.2011, 19:01
Сообщение #5





Гости








    


Цитата(quarz @ 13.4.2011, 18:20) *
В SIGNAL() и SLOT() обычно не указывают имена аргументов, только их типы. Возможно Creator хотел сказать именно это.
Попробуй так:
connect(timer, SIGNAL(timeout()), this, SLOT(showMessage(QTimer*)));

Да, действительно. Спасибо. :)
Теперь следующая лажа.
QObject::connect: Incompatible sender/receiver arguments
        QTimer::timeout() --> DigitalClock::showMessage(QTimer*)

При компиляции и последующем запуске программы мне такое выдаёт, и никакого действия по событию timeout() у таймера не происходит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_oneassasin_*
сообщение 13.4.2011, 19:12
Сообщение #6





Гости








    


Исходный код

timer.h

#ifndef DIGITALCLOCK_H
#define DIGITALCLOCK_H

#include <QLCDNumber>

//! [0]
class DigitalClock : public QLCDNumber // потом сделаю что-бы время здесь шло
{
    Q_OBJECT

public:
    DigitalClock();
    void startTimer();

private slots:
    void showMessage(QTimer*);
    void showQuestion();
};
//! [0]

#endif


timer.cpp
#include <QtGui>

#include "digitalclock.h"

DigitalClock::DigitalClock()
{
    QTextCodec *codec = QTextCodec::codecForName("CP1251");
      QTextCodec::setCodecForTr(codec);
      setWindowTitle(QObject::tr("Заголовок"));
      this->startTimer();
}

void DigitalClock::startTimer()
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(showMessage(QTimer*)));
    timer->start(600000);
}

void DigitalClock::showMessage(QTimer* timer)
{
    QMessageBox msgBox;
    msgBox.setText(QObject::tr("123"));
    msgBox.exec();
    timer->stop();
    this->showQuestion();
}

void DigitalClock::showQuestion()
{
    QMessageBox msgBox;
            msgBox.setText(""); // Заголовок
            msgBox.setIcon(QMessageBox::Information);
            msgBox.setInformativeText(QObject::tr("Ещё раз?"));
            msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); // Кнопки
            msgBox.setDefaultButton(QMessageBox::Ok); // Фокус на Ок

            int ret = msgBox.exec();
             switch (ret) {
               case QMessageBox::Cancel:
                 QApplication::exit();
                   break;
               case QMessageBox::Ok:
                   this->startTimer();
                   break;
               default:
                   QApplication::exit();
                   break;
             }
}


main.cpp

#include <QtGui>

#include "digitalclock.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    DigitalClock clock;
    clock.show();
    return app.exec();
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 13.4.2011, 19:38
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


Цитата(Гость_oneassasin_* @ 13.4.2011, 19:01) *
connect(timer, SIGNAL(timeout()), this, SLOT(showMessage(QTimer*)));

сигнал без аргументов, значит слот должен быть без аргументов,
суть таймера - прошло время, послан сигнал - вызван слот, слоту не нужен указатель на таймер
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_oneassasin_*
сообщение 13.4.2011, 19:51
Сообщение #8





Гости








    


Ну, а как мне тогда сделать стоп таймера в слоте showMessage?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 13.4.2011, 20:09
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


сделай таймер членом класса
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_oneassasin_*
сообщение 13.4.2011, 20:47
Сообщение #10





Гости








    


class DigitalClock : public QLCDNumber
{
    Q_OBJECT

public:
    DigitalClock();
    void startTimer();
    QTimer* timer;

private slots:
    void showMessage();
    void showQuestion();
};

Так? Если так, то программа не запускается и выдаёт
Цитата
завершился с кодом -1073741819
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.12.2024, 3:08