Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: nixman05 от Июль 25, 2011, 18:05



Название: QDateEdit с возможностью ввода пустой даты
Отправлено: nixman05 от Июль 25, 2011, 18:05
Здравствуйте.
Решил расширить возможности стандартного QDateEdit.
Создал класс QmnDateEdit, который позволяет задавать пустые даты.
Компонент содержит checkBox, который управляет доступностью ввода даты.

qmndateedit.h
Код
C++ (Qt)
#ifndef QMNDATEEDIT_H
#define QMNDATEEDIT_H
 
#include <QObject>
#include <QDateEdit>
#include <QtGui/QCheckBox>
#include <QtGui/QStyle>
#include <QtCore/QList>
#include <QtGui/QLineEdit>
#include <QtGui/QCalendarWidget>
 
class QmnDateEdit : public QDateEdit
{
   Q_OBJECT
public:
   explicit QmnDateEdit(QWidget *parent = 0);
 
signals:
 
public slots:
   void show();
   void setDate ( const QDate & date );
 
protected:
   void resizeEvent(QResizeEvent *event);
public:
   QDate date() const;
protected slots:
   void setEditable(bool f);
private:
   QCheckBox *notNull;
   QLineEdit *edit;
 
};
 
#endif // QMNDATEEDIT_H
 

qmndateedit.cpp
Код
C++ (Qt)
QmnDateEdit::QmnDateEdit(QWidget *parent) :
   QDateEdit(parent)
{
   this->setCalendarPopup(true);
   this->setDisplayFormat("dd.MM.yyyy");
 
   notNull=new QCheckBox(this);
   notNull->setChecked(true);
   edit=new QLineEdit();
   this->calendarWidget()->setFirstDayOfWeek(Qt::Monday);
   qDebug("created");
}
 
void QmnDateEdit::setDate(const QDate &date)
{
   notNull->setChecked(!date.isNull());
   if (!date.isNull()){
       QDateEdit::setDate(date);
   }
 
}
 
QDate QmnDateEdit::date() const
{
   return notNull->isChecked() ? QDateEdit::date() : QDate();
}
 
void QmnDateEdit::setEditable(bool f)
{
   QDateEdit::setReadOnly(!f);
}
 
void QmnDateEdit::resizeEvent(QResizeEvent *event)
{
   QDateTimeEdit::resizeEvent(event);
   QSize csize=notNull->sizeHint();
   int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
   int check_s=style()->pixelMetric(QStyle::PM_CheckBoxLabelSpacing);
   notNull->move(rect().left() + frameWidth*4 /*+ csize.width()*/,
                (rect().bottom() + 1 - csize.height())/2);
 
   edit=QAbstractSpinBox::lineEdit();
   edit->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
   QObject::connect(notNull,SIGNAL(toggled(bool)),this,SLOT(setEditable(bool)));
   QSize esize=edit->sizeHint();
 
}
 
 


Тестовое приложение
Код
C++ (Qt)
#include <QtGui/QApplication>
#include <QtGui/QGridLayout>
#include <QtCore/QDate>
#include <QtGui/QLabel>
 
#include "qmndateedit.h"
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   qDebug("started");
 
   QmnDateEdit *date_edit=new QmnDateEdit();
   date_edit->setDate(QDate(2011,1,1));
   QGridLayout layout;
   QLabel *label=new QLabel("Date");
   layout.addWidget(label,0,0);
   layout.addWidget(date_edit,0,1);
   QWidget *widget=new QWidget();
   widget->setLayout(&layout);
   widget->adjustSize();
   widget->show();
 
   return a.exec();
}
 

Но есть некоторые проблемы:
1. стандартный размер компонента такой-же как и QDateEdit, и как следствие, если его не растянуть, то чекбокс закрывает часть даты. Наверное, копать следует в сторону sizeHint(), как?
2.  В некоторых стилях checkBox вылазит по высоте за пределы строки ввода. Можно-ли  у checkBox'а убрать рамку и уменьшить его?


Название: Re: QDateEdit с возможностью ввода пустой даты
Отправлено: nixman05 от Июль 25, 2011, 20:04
Установка размеров
Код
C++ (Qt)
QSize QmnDateEdit::sizeHint() const
{
 QSize size=QDateEdit::sizeHint();
 QSize csize=notNull->sizeHint();
 int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
 size.setWidth(size.width()+frameWidth + csize.width());
 return size;
}