我有一个带有事件日期的QList<QDate>
,我想在QCalendarWidget
上突出显示这些日期,希望可以通过图像来更改单元格的颜色。
我可能在代码中犯了一个新手错误...
我从(Here)修改的这段代码应该使QCalendarWidget
用红色边框绘制日期,但是它没有...
mainwindor.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_manager = new CalendarManager(ui->calendarWidget);
setupConnections();
on_calendarWidget_clicked(QDate::currentDate());
}
/* GUI button behavior */
calendarmanager.h
#ifndef CALENDARMANAGER_H
#define CALENDARMANAGER_H
#include <QCalendarWidget>
#include <QStringList>
#include <QBrush>
#include <QColor>
#include <QFile>
#include <QList>
#include <QDate>
#include <QPen>
class CalendarManager : public QCalendarWidget
{
Q_OBJECT
Q_PROPERTY(QColor color READ getColor WRITE setColor)
public:
CalendarManager(QWidget *parent = 0);
~CalendarManager();
void setColor(const QColor &color);
QColor getColor() const;
protected:
virtual void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const;
private:
struct calendarEvent
{
QDate date;
QString name;
};
QList<calendarEvent> m_events;
QList<QDate> m_dates;
QPen m_outlinePen;
QBrush m_transparentBrush;
void getDates();
};
#endif // CALENDARMANAGER_H
calendarmanager.cpp
#include <QPainter>
#include "calendarmanager.h"
CalendarManager::CalendarManager(QWidget *parent)
: QCalendarWidget(parent)
{
m_outlinePen.setColor(Qt::red);
m_transparentBrush.setColor(Qt::transparent);
getDates();
}
CalendarManager::~CalendarManager()
{
}
void CalendarManager::setColor(const QColor &color)
{
m_outlinePen.setColor(color);
}
QColor CalendarManager::getColor() const
{
return ( m_outlinePen.color() );
}
void CalendarManager::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const
{
QCalendarWidget::paintCell(painter, rect, date);
if( m_dates.contains(date) ) {
painter->setPen(m_outlinePen);
painter->setBrush(m_transparentBrush);
painter->drawRect(rect.adjusted(0, 0, -1, -1));
}
}
void CalendarManager::getDates()
{
QFile file("/data/events.csv");
if(!file.open(QIODevice::ReadOnly)) {
//Error code
}
QList<QByteArray> wordList;
QDate date;
QString name;
calendarEvent e;
while(!file.atEnd()) {
QByteArray line = file.readLine();
wordList = line.split(',');
date = QDate::fromString( wordList.first(), "dd/MM/yyyy" );
name = wordList.last();
e.date = date;
e.name = name;
m_events.append(e);
m_dates.append(date);
}
file.close();
}
最佳答案
问题在于,即使您传递父m_manager
,在创建ui->calendarWidget
时也不会在GUI中包括它。
您应该做的是促进GUI使用该小部件,您可以从设计 View 中轻松地进行操作。
Promote to
:QCalendarWidget
作为基类,提升类名称:CalendarManager
和 header 文件:calendarmanager.h
屏幕截图:
注意:如果我们查看
m_manager
是ui->calendarwidget
的实例,则不必创建CalendarManager
。关于c++ - QCalendarWidget-如何突出显示日期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45134809/