首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QCalendarWidget -如何突出显示日期

QCalendarWidget -如何突出显示日期
EN

Stack Overflow用户
提问于 2017-07-17 01:24:54
回答 1查看 2.9K关注 0票数 1

我有一个带有事件日期的QList<QDate>,我想在QCalendarWidget上突出显示这些日期,希望通过图像可以改变单元格颜色。

我可能在我的代码里犯了个新手的错误.

我从(这里)修改的代码应该使QCalendarWidget用红色边框绘制日期,但它不.

mainwindor.cpp

代码语言:javascript
复制
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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-17 01:52:56

问题是,在创建m_manager时,即使您传递父ui->calendarWidget,也没有将其包含在GUI中。

您应该做的是促进您的GUI使用该小部件,您可以轻松地从设计视图。

  1. 右键单击calendarWidget并选择Promote to

  1. 选择基类a QCalendarWidget提升的类名CalendarManager头文件calendarmanager.h

  1. 按Add并推广:

产出截图:

注意:如果我们看到m_managerCalendarManager的一个实例,那么创建CalendarManager就没有必要了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45134809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档