简
本片博客中代码仅使用于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