Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Gate007 от Февраль 15, 2012, 14:42



Название: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: Gate007 от Февраль 15, 2012, 14:42
Задача: сделать так, чтобы в компоненте timeedit отображалось текущее время.
Как я себе это представляю:
Имеется компонент типа Qtimeedit, у него есть функция setTime. Для получения текущего времени необходимо использовать объект типа QTime, у которого есть функция currentTime и сигнал timeout. Соответственно нужен слот, который будет соединен с сигналом timeout, а у него в обработчике будет установка текущего времени для объекта timeedit.
Если неправ-подскажите где, если прав-смотрим дальше.
Пытаюсь реализовать. Для этого в заголовочном файле

Код
C++ (Qt)
class Myclass : public MainWindow {
Q_OBJECT
 
public slots:
  void mySlot();
 
};

Далее в cpp:

Код
C++ (Qt)
void Myclass::mySlot()
{
QTime time_obj;
ui->timeEdit->setTime(time_obj.currentTime());
}

Ошибка 'Ui::MainWindow* MainWindow::ui' is private
А как тогда мне обратиться к визуальному элементу не из класса mainwindow?


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: andrew.k от Февраль 15, 2012, 14:53
1. Сделать у класса MyClass публичный метод setTime(const QTime &time), который будет задавать время как надо (лучше)
2. Сделать ui публичным в MyClass (хуже)


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: sudo от Февраль 15, 2012, 14:55
Я здесь ui вообще не вижу. Доступ к нему должен быть.
Увидел. Либо сделать сеттер для времени, либо перенести ui в protected

Создавать объект QTime не нужно, его метод статический
Сигнал timeout() есть у QTimer, у QTime его нет

QTime, QDate и QDateTime вообще не имеют ни слотов, ни сигналов, они не являются QObject'ами


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: andrew.k от Февраль 15, 2012, 15:09
Я здесь ui вообще не вижу. Доступ к нему должен быть.
Увидел.
Где?
Либо сделать сеттер для времени, либо перенести ui в protected
в public


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: sudo от Февраль 15, 2012, 15:12
Где?

MyClass отнаследован от MainWindow. Судя по ошибке компилятора ui именно там

в public

У нас же публичное наследование, protected будет достаточно для доступа


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: andrew.k от Февраль 15, 2012, 15:28
Где?

MyClass отнаследован от MainWindow. Судя по ошибке компилятора ui именно там

в public

У нас же публичное наследование, protected будет достаточно для доступа
1. Где ты увидел, что там используется наследование?
2. Судя по ошибке компилятора используется агрегация через указатель.
3. Видимо ТС копировать не умеет (хороший программист будет), поэтому переписывал код по памяти и не весь переписал.
4. Какая связь между уровнем доступа и типом наследования? Ее нет.
5. protected будет недостаточно.

Афигеть можно.


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: sudo от Февраль 15, 2012, 15:38
1.
class MyClass : public MainWindow - это не наследование?
2.
Именно судя по ошибке компилятора ui находится в MainWindow
3.
Да, одного класса не хватает
4-5.
Прочитай хотя бы у Алёны С++ (если не знаешь, кто это, то это печально ;) ) про права доступа при наследовании http://alenacpp.blogspot.com/2006/03/blog-post_11.html


Андрей, ну я тебя прошу, если мне не веришь, напиши сэмпл ;) Хотя про тип наследования я сказанул не подумав, освежил в памяти этот вид сексуальных извращений


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: Пантер от Февраль 15, 2012, 16:00
Gate007, покажи полностью содержимое cpp/h.


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: Gate007 от Февраль 15, 2012, 16:13
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
namespace Ui {
   class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   Ui::MainWindow *ui;
};
class Myclass : public MainWindow {
Q_OBJECT
 
public slots:
  void mySlot();
 
};
 
#endif // MAINWINDOW_H

Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QTime"
#include "QTimer"
 
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
//    MyClass ddd;
//    QObject::connect(time_obj, SIGNAL( timeout() ),
//                      ddd,  SLOT(mySlot));
}
 
void Myclass::mySlot()
{
QTime time_obj;
ui->timeEdit->setTime(time_obj.currentTime());
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: Пантер от Февраль 15, 2012, 16:31
Зачем тебе Myclass? Определяй слот в MainWindow.


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: andrew.k от Февраль 15, 2012, 16:32
1.
class MyClass : public MainWindow - это не наследование?
Не заметил, что буквы Q нет.
Неужели, кто-то пользуется этим методом встраивания UI?
Тогда все равно странно. Класс сформированый после uic находится в неймспейсе Ui.
А тут какой-то неведомый класс MainWindow. Какие тут можно сделать выводы? Никаких.

Цитировать
Прочитай хотя бы у Алёны С++ (если не знаешь, кто это, то это печально  ) про права доступа при наследовании http://alenacpp.blogspot.com/2006/03/blog-post_11.html
Рассмешил.


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: andrew.k от Февраль 15, 2012, 16:34
4-5.
Прочитай хотя бы у Алёны С++ (если не знаешь, кто это, то это печально ;) ) про права доступа при наследовании http://alenacpp.blogspot.com/2006/03/blog-post_11.html


Андрей, ну я тебя прошу, если мне не веришь, напиши сэмпл ;) Хотя про тип наследования я сказанул не подумав, освежил в памяти этот вид сексуальных извращений
Вот специально для тебя, sudo, открыл ссылку и нашел строку.

Цитировать
public наследование
protected и public данные из CBase остаются, соответственно protected и public.

PS прямо горячая тема получилась)))


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: sudo от Февраль 15, 2012, 16:37
Так тогда чем protected не нравится?
И я ж говорю, про тип наследования сказанул не подумав, за несколько лет абсолютнейшего неиспользования чего либо кроме public остальное затёрлось нафиг, поэтому могу даже спасибо сказать )


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: andrew.k от Февраль 15, 2012, 16:45
Так тогда чем protected не нравится?
И я ж говорю, про тип наследования сказанул не подумав, за несколько лет абсолютнейшего неиспользования чего либо кроме public остальное затёрлось нафиг, поэтому могу даже спасибо сказать )
Достаточно запомнить, что уровень доступа нельзя повысить, лишь понизить.


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: sudo от Февраль 15, 2012, 17:00
Ладно, ты мне ответь, вот есть наш случай:

Код:
class Foo
{
  public:
    Foo();

  protected:
    m_member;
}

class Boo : public Foo
{
  public:
    Boo();
}

Скажи, из Boo мы можем обратиться напрямую к m_member?


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: andrew.k от Февраль 15, 2012, 17:02
Ладно, ты мне ответь, вот есть наш случай:

Код:
class Foo
{
  public:
    Foo();

  protected:
    m_member;
}

class Boo : public Foo
{
  public:
    Boo();
}

Скажи, из Boo мы можем обратиться напрямую к m_member?
Прочитай пару раз свою Алену, узнаешь.


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: sudo от Февраль 15, 2012, 17:02
Ты мне не как Одессит, а нормально ответь


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: kambala от Февраль 15, 2012, 17:04
естественно можем


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: andrew.k от Февраль 15, 2012, 17:04
Ты мне не как Одессит, а нормально ответь
Это основы с++, если ты этого не знаешь, это печально.


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: andrew.k от Февраль 15, 2012, 17:08
естественно можем
антисемит!


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: sudo от Февраль 15, 2012, 17:12
естественно можем

Да понятно, что можем, но меня Андрей старательно убеждал, что protected не будет достаточно для ТС.
Ну и уровень доступа тоже можно поменять ;) Только если приходится это делать, значит что-то написано не так...


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: kambala от Февраль 15, 2012, 17:22
ТС вообще какими-то извращениями занимается, о чём ему уже сказали. разве что конечно у него или приложение имеет 2 главных окна (так разве делают?) или MainWindow - это какой-то лично свой базовый класс всех главных окон при разработке приложений.


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: sudo от Февраль 15, 2012, 17:25
Извращение у него только в использовании отнаследованного от MainWindow MyClassa, он нафиг не нужен - это точно. А так, MainWindow - главное окно, всё нормально :)


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: Gate007 от Февраль 17, 2012, 11:11
Я премного счастлив что тема вызвала столь бурную дискуссию и заставила кого-то размышлять о смысле программирования/жизни.
Все что я понял из вашей дискуссии-что мне не нужен класс myclass. Хорошо, пусть без него.
Тогда выходит:
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
namespace Ui {
   class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   Ui::MainWindow *ui;
public slots:
      void mySlot();
};
 
 
#endif // MAINWINDOW_H
Здесь все понятно, вопросов нет.

cpp:
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QTime"
#include "QTimer"
 
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   QTimer mytimer;
   QObject::connect(&mytimer, SIGNAL( timeout() ),
                     this,  SLOT(mySlot()));
}
 
void MainWindow::mySlot()
{
QTime time_obj;
ui->timeEdit->setTime(time_obj.currentTime());
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
Но слот mySlot не вызывается. Что не так? Насколько я понял, mytimer, SIGNAL( timeout() ) вырабатывается каждую секунду.


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: sudo от Февраль 17, 2012, 11:15
Таймер запусти ;) Метод start
Только полем класса сделай, а то помрёт при завершении работы конструктора


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: Gate007 от Февраль 17, 2012, 13:37
Таймер запусти ;) Метод start
Только полем класса сделай, а то помрёт при завершении работы конструктора
Спасибо, что то я про старт и забыл :)
А можно подробнее почему он должен помирать? Точнее не должен, а правда помирает :)


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: mutineer от Февраль 17, 2012, 13:44
Потому что создан на стеке в методе - то есть это локальная переменная метода. Дальше - в справке по плюсам


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: Gate007 от Март 12, 2012, 13:46
Код особо не изменился, много думал, поправил.
Следующая проблема-после старта таймера загрузка цп 100%. Не понимаю причины, единственное что приходит в голову-возможно проблема в работе на виртуалке, на которой стоит Qt creator?
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include "QTime"
#include "QTimer"
namespace Ui {
   class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
   QTimer mytimer;
   QDate curDate;
private:
   Ui::MainWindow *ui;
public slots:
      void mySlot();
};
 
 
#endif // MAINWINDOW_H

Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QTime"
#include "QTimer"
#include "QDate"
 
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   mytimer.start();
   QObject::connect(&mytimer, SIGNAL( timeout() ),
                     this,  SLOT(mySlot()));
   curDate = QDate::currentDate();
}
 
void MainWindow::mySlot()
{
QTime time_obj;
ui->timeEdit->setTime(time_obj.currentTime());
ui->lcdNumber_2->display(curDate.toString("d"));
}
 
MainWindow::~MainWindow()
{
   delete ui;
}


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: mutineer от Март 12, 2012, 13:49
Проблема в том, что ты таймеру не выставил интервал и он фигачит timeout() в каждый проход EventLoop, то бишь практически каждую свободную милисекунду


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: Gate007 от Март 12, 2012, 14:11
Спасибо! Все получилось :)
P.S: для "самых маленьких": таймаут выставляется в методе Start.


Название: Re: Сигналы и слоты, текущее время в компоненте типа Qtimeedit.
Отправлено: mutineer от Март 12, 2012, 14:14
Спасибо! Все получилось :)
P.S: для "самых маленьких": таймаут выставляется в методе Start.

Для совсем маленьких - в доках по таймеру описано как выставляется таймаут и как работает таймер