Russian Qt Forum

Qt => Вопросы новичков => Тема начата: CJ1 от Ноябрь 18, 2012, 18:41



Название: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 18, 2012, 18:41
Такой теперь вопрос.
Вот я сделал себе QcalendarWidget  как делегат. А как мне при двойном щелчке по числу закрыть его? И чтоб вызвался setEditorData


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 18, 2012, 18:52
Он у меня работает, но просто если выбрал число и в сторону нажал, а мне бы набо было при двойном щелчке


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 18, 2012, 20:16
Вот смотрите Отнаследовался  я от QcalendarWidget
Код
C++ (Qt)
class calendar: public  QCalendarWidget
{
public:
   explicit calendar(QWidget *parent = 0);
 
private:
   bool event(QEvent *event);
  void mousePressEvent(QMouseEvent *event);
};


А тут я реализую
Код
C++ (Qt)
#include "calendar.h"
 
calendar::calendar(QWidget *parent):QCalendarWidget(parent){}
 
 
void calendar::mousePressEvent(QMouseEvent *event)
{
   QMessageBox::about(0,"","Событие от мышки");
 
 
}
 
 
bool calendar::event(QEvent *event)
{
   if (event->type()  == QEvent::MouseButtonDblClick)
   {
       QMessageBox::about(0,"","Двойной щелчек");
   }
   return QCalendarWidget::event(event);
}
 

Но он не реагирует на событие! Почему?


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 18, 2012, 20:32
Ну помогите люди добрые!


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 18, 2012, 20:45
Ух ты! если по заголовку QcalendarWidget щелкаешь 2 раза то срабатывает!
А почему по числам не срабатывает?


Название: Re: QcalendarWidget делегат
Отправлено: kambala от Ноябрь 19, 2012, 00:01
предлагаю тебе почитать документацию по этому виджету, особенно раздел сигналов


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 19, 2012, 08:01
Да читал я!
Там только есть сигнал 1 раз кликнуть, или сигнал что дата выбрана, вот этим и пользуюсь! А хотел бы 2 раза клик


Название: Re: QcalendarWidget делегат
Отправлено: Bepec от Ноябрь 19, 2012, 08:59
Он наследован от QWidget, т.е. ты можешь отнаследовать свой класс и переопределить метод MousePressEvent и отлавливать двойное нажатие.
Так же ты можешь поставить на него eventFilter ( без переопределения) и так же ловить двойное нажатие.



Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 19, 2012, 09:32
ВООООООООООООТ и я об этом! Я наследовался! И сверху написал! Но двойной щелчок приходит если я щелкну по заголовку календаря! Если же я выбираю дату и щелкаю по ней, то ничего не приходит!!!!!!


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 19, 2012, 09:39
Вот пояснения в картинке


Название: Re: QcalendarWidget делегат
Отправлено: Bepec от Ноябрь 19, 2012, 09:55
Логично. Если мне не изменяет память, та область является QScrollArea(не помню точно, помоему этот тип). Потому фильтр нужно ставить не на него самого, а на viewPort его.


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 19, 2012, 10:15
Так! Его viewport это QTableWidget, значит мне надо получить QRect календаря, а в обработчике событий QTableWidget проверить, щелкнул ли пользователь два раза в этом квадрате. Так.
Но тут проблема, как я передам в TableWidget QRect календаря?


Название: Re: QcalendarWidget делегат
Отправлено: Bepec от Ноябрь 19, 2012, 10:24
Кхм. Более точно ответить на ваш вопрос я не могу. Ибо с календар виджетом не работал вообще.

Могу покопаться в его нутрях, но только если вам это очень надо.



Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 19, 2012, 10:26
Очень нужно! Спасибо за отзывчивость!
Тут вообще календарь то делегат!


Название: Re: QcalendarWidget делегат
Отправлено: Bepec от Ноябрь 19, 2012, 10:31
Он виджетом от этого не перестал быть :)

PS до вечера посмотрю. Как освобожусь в общем.


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 19, 2012, 11:06
Еще такой вопрос теперь
Код
C++ (Qt)
class calendar: public  QCalendarWidget
{
    Q_OBJECT
public:
   explicit calendar(QWidget *parent = 0);
 
private slots:
  void ClickDate(QDate);
 //  void a();
 
protected:
  bool event(QEvent *event);
 // bool b;
};

Q_OBJECT вставлять надо????
Если да то почему он мне пишет

calendar.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual struct QMetaObject const * __thiscall calendar::metaObject(void)const " (?metaObject@calendar@@UBEPBUQMetaObject@@XZ)"

calendar.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual void * __thiscall calendar::qt_metacast(char const *)" (?qt_metacast@calendar@@UAEPAXPBD@Z)"


calendar.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual int __thiscall calendar::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@calendar@@UAEHW4Call@QMetaObject@@HPAPAX@Z)"


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 19, 2012, 11:13
Исправил! Указав другое место зборки, фиг поймешь почему так.

Но теперь не видит слот!
QMetaObject::connectSlotsByName: No matching signal for on_calendarWidget_clicked(QDate)


Код
C++ (Qt)
#ifndef CALENDAR_H
#define CALENDAR_H
#include <QCalendarWidget>
#include <QMessageBox>
#include <QEvent>
#include <QMouseEvent>
#include <QTimer>
 
class calendar: public  QCalendarWidget
{
    Q_OBJECT
public:
   explicit calendar(QWidget *parent = 0);
 
private slots:
  void ClickDate(QDate);
 //  void a();
 
protected:
  bool event(QEvent *event);
 // bool b;
};
 
#endif // CALENDAR_H
 


Код
C++ (Qt)
#include "calendar.h"
 
calendar::calendar(QWidget *parent):QCalendarWidget(parent)
{
   //QObject::connect( this,SIGNAL(clicked(QDate)), this , SLOT(ClickDate(QDate))    );
 
 
 
}
 
 
 
//void calendar::a()
//{
//    b = false;
//}
 
void calendar::ClickDate(QDate date)
{
   QMessageBox::about(0,"","a");
//    if (!b){
//        QTimer::singleShot(5,this,SLOT(a()));
//    } else close();
}
 
 
 
bool calendar::event(QEvent *event)
{
   if (event->type()  == QEvent::MouseButtonDblClick)
   {
       QMessageBox::about(0,"","Двойной щелчек");
   }
   return QCalendarWidget::event(event);
}
 
 
 
 


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 19, 2012, 11:27
Все! Сделал двойной щелчок вот так

Код
C++ (Qt)
#ifndef CALENDAR_H
#define CALENDAR_H
#include <QCalendarWidget>
#include <QTimer>
 
class calendar: public  QCalendarWidget
{
    Q_OBJECT
public:
   explicit calendar(QWidget *parent = 0);
 
private slots:
  void ClickDate(QDate);
  void time();
 
private:
  bool b;
  QDate date;
};
 
#endif // CALENDAR_H
 

Код
C++ (Qt)
#include "calendar.h"
 
calendar::calendar(QWidget *parent):QCalendarWidget(parent)
{
   QObject::connect( this,SIGNAL(clicked(QDate)), this , SLOT(ClickDate(QDate))    );
   b= false;
}
 
 
void calendar::time()
{
   b = false;
}
 
void calendar::ClickDate(QDate date)
{
   if (!b){
       b = true;
       QTimer::singleShot(3000,this,SLOT(time()));
       this->date = date;
   } else
   {
       if (this->date == date) close();
   }
}
 
 


Название: Re: QcalendarWidget делегат
Отправлено: mutineer от Ноябрь 19, 2012, 12:06
Исправил! Указав другое место зборки, фиг поймешь почему так.

Потому что после добавления Q_OBJECT к классу, который до этого был скомпилирован без этого макроса, нужно делать полную пересборку проекта


Название: Re: QcalendarWidget делегат
Отправлено: CJ1 от Ноябрь 19, 2012, 12:45
А, нет, не помогло, пока не удалил полностью все файлы которые создает криэтор