#include "LineStyleView.h" #include #include #include #include #include #include #include class LineStyleModel:public QAbstractTableModel { public: explicit LineStyleModel(QObject *parent=NULL): QAbstractTableModel(parent){ m_PenList <<(int) Qt::SolidLine <<(int)Qt::DashLine <<(int) Qt::DotLine <<(int)Qt::DashDotLine <<(int) Qt::DashDotDotLine; } ~LineStyleModel(){} // QAbstractItemModel interface public: virtual int rowCount(const QModelIndex &parent) const { return 5; } virtual int columnCount(const QModelIndex &parent) const { return 3; } virtual QVariant data(const QModelIndex &index, int role) const { if(!index.isValid() || index.row() <0 ||index.column() <0) { return QVariant(); } if(role == Qt::DisplayRole) { return m_PenList.at(index.row()); } return QVariant(); } private: QList m_PenList; }; class LineItemStyleDelegate:public QStyledItemDelegate { public: LineItemStyleDelegate(QObject *parent=NULL):QStyledItemDelegate(parent) { } ~LineItemStyleDelegate(){} // QAbstractItemDelegate interface public: virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { // QStyledItemDelegate::paint(painter,option,index); QStyleOptionViewItemV3 v3=option; QWidget *widget= (QWidget*)v3.widget; QTableView* view=qobject_cast(widget); int colIndex=index.column(); QPen linePen; QPointF p1,p2,pCenter; QRect cellRect=option.rect; Qt::PenStyle pStyle= (Qt::PenStyle)index.data(Qt::DisplayRole).value(); if(view) { QModelIndex curIndex=view->currentIndex(); if(curIndex == index) { painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(Qt::lightGray); painter->drawRect(cellRect); painter->restore(); } } //if(pStyle == Qt::NoPen) //{ // painter->drawText(cellRect,QString::fromLocal8Bit("无"),QTextOption(Qt::AlignCenter|Qt::AlignVCenter)); //} linePen=painter->pen(); linePen.setWidthF(colIndex+1); linePen.setStyle(pStyle); //if(pStyle != Qt::NoPen) painter->setPen(linePen); pCenter=cellRect.center(); cellRect= cellRect.adjusted(10,0,-10,0); p1.setX(cellRect.left()); p1.setY(pCenter.y()); p2.setX(cellRect.right()); p2.setY(pCenter.y()); //if(pStyle != Qt::NoPen) painter->drawLine(p1,p2); } }; LineStyleView::LineStyleView(QWidget *parent) : QTableView(parent),m_currentStyle((int)Qt::SolidLine),m_currentLineWidth(1) { horizontalHeader()->setVisible(false); verticalHeader()->setVisible(false); horizontalScrollBar()->setVisible(false); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setGridStyle(Qt::NoPen); setSelectionMode(QAbstractItemView::SingleSelection); setSelectionBehavior(QAbstractItemView::SelectItems); setModel(new LineStyleModel(this)); LineItemStyleDelegate *lineStyle=new LineItemStyleDelegate(this); setMouseTracking(true); setItemDelegate(lineStyle); connect(this,SIGNAL(pressed(const QModelIndex&)),this,SLOT(slotCellPressed(const QModelIndex&))); } LineStyleView::~LineStyleView() { } void LineStyleView::slotCellPressed(const QModelIndex &mIndex) { int row=mIndex.row(); int col=mIndex.column(); if (row <0 || col <0 ) { return; } LineStyleModel* styleModel=dynamic_cast(model()); if (!styleModel) { return; } int styleValue=styleModel->data(mIndex,Qt::DisplayRole).toInt(); int lineWindth=mIndex.column()+1; if (m_currentStyle != styleValue || m_currentLineWidth !=lineWindth) { m_currentStyle=styleValue; m_currentLineWidth=lineWindth; emit signalSelectLineStyleChanged(styleValue,lineWindth); } } void LineStyleView::resizeEvent(QResizeEvent *reSize) { if(reSize->size().isValid()) { int h=reSize->size().height(); int w=reSize->size().width(); int count= model()->columnCount(); int sValue=w/(float)count; for(int j=0;jrowCount(); sValue=h/(float)count; for(int i=0;i