我有一个带有事件日期的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 中轻松地进行操作。

  • 右键单击calendarWidget,然后选择Promote to:

  • c&#43;&#43; - QCalendarWidget-如何突出显示日期-LMLPHP
  • 选择一个QCalendarWidget作为基类提升类名称:CalendarManager header 文件:calendarmanager.h

  • c&#43;&#43; - QCalendarWidget-如何突出显示日期-LMLPHP
  • 按添加和升级:

  • c&#43;&#43; - QCalendarWidget-如何突出显示日期-LMLPHP

    屏幕截图:

    c&#43;&#43; - QCalendarWidget-如何突出显示日期-LMLPHP

    注意:如果我们查看m_managerui->calendarwidget的实例,则不必创建CalendarManager

    关于c++ - QCalendarWidget-如何突出显示日期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45134809/

    10-11 00:52