Здравствуйте.
Решил расширить возможности стандартного 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'а убрать рамку и уменьшить его?