Qt:甘特图控件

本片博客中代码仅使用于Qt4,Qt5中已经提供了QChart类无需在造轮子实现类似效果。

在这片博客中,我将详细讲述如何是通过QAbstractItemView定制一个GanttView。本篇博文中的代码参考自Qt4例子chart,有兴趣的同学可以查看chart代码深入理解如何定制自己的view控件。(注:在写这篇博客的代码时犯了懒癌,不想写注释……)

详细代码

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSplitter>
#include <QTableView>
#include "GanttView.h"
#include <QStandardItemModel>
#include <QTableView>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    void initModel();
    void initView();

private:
    Ui::MainWindow *ui;

    QSplitter *_splitter;
    QAbstractItemModel *_model;
    QTableView *_table;
    GanttView *_ganttView;
    QItemSelectionModel *_selectionModel;
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    initModel();
    initView();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initModel()
{
    _model = new QStandardItemModel(5,3,this);
    _model->setHeaderData(0,Qt::Horizontal,QString("event"));
    _model->setHeaderData(1,Qt::Horizontal,QString("StartDate"));
    _model->setHeaderData(2,Qt::Horizontal,QString("EndDate"));

    QDate startDate = QDate::currentDate();
    for (int row = 0; row < _model->rowCount(); ++row)
    {
        _model->setData(_model->index(row,0),QString::number(row+1));
        _model->setData(_model->index(row,1),startDate.addDays(row));
        _model->setData(_model->index(row,2),startDate.addDays(row+5));
    }
}

void MainWindow::initView()
{
    _splitter = new QSplitter;

    _table = new QTableView;
    _table->setModel(_model);
    _table->setSelectionMode(QAbstractItemView::SingleSelection);
    _table->setSelectionBehavior(QAbstractItemView::SelectRows);
    _table->horizontalHeader()->setStretchLastSection(true);
    _table->horizontalHeader()->setDefaultSectionSize(100);
    _table->horizontalHeader()->setMinimumWidth(100);
    _table->verticalHeader()->setVisible(false);

    _ganttView = new GanttView;
    _ganttView->setModel(_model);

    QItemSelectionModel *selectionModel = new QItemSelectionModel(_model);
    _table->setSelectionModel(selectionModel);
    _ganttView->setSelectionModel(selectionModel);

    _splitter->addWidget(_table);
    _splitter->addWidget(_ganttView);

    _splitter->setStretchFactor(0, 2);
    _splitter->setStretchFactor(1, 3);

    setCentralWidget(_splitter);
}

GanttView.h

#ifndef GanttView_H
#define GanttView_H

#include <QAbstractItemView>
#include <QFont>
#include <QItemSelection>
#include <QItemSelectionModel>
#include <QStandardItemModel>
#include <QModelIndex>
#include <QRect>
#include <QSize>
#include <QPoint>
#include <QWidget>
#include <QDate>

class GanttView : public QAbstractItemView
{
    Q_OBJECT
public:
    explicit GanttView(QWidget *parent = 0);
    ~Gan
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值