OperationColumnDelegate.h
#include <QStyledItemDelegate>
#include <QPushButton>
class OperationColumnDelegate : public QStyledItemDelegate
{
Q_OBJECT
enum
{
mouse_state_none = 0,
mouse_state_hover,
mouse_state_pressed,
};
public:
explicit OperationColumnDelegate(QObject *parent = nullptr);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
Q_SIGNALS:
void requsetView(QPoint point, QString content);
void requsetVideoWidget(int row, QStringList userIds);
void requsetDetails(int row, DdTaskInfo info);
void requsetShowUsers(QPoint point, QStringList userIds);
private:
QScopedPointer<QPushButton> m_pViewButtonPoint;
QScopedPointer<QPushButton> m_pUsersButtonPoint;
QScopedPointer<QPushButton> m_pOperationButtonPoint;
int m_nMouseState;
QPoint m_mousePoint;
};
OperationColumnDelegate.cpp
#include <QApplication>
#include <QMouseEvent>
#include <QPainter>
#include <QHBoxLayout>
#include <QToolTip>
#define BUTTON_WIDTH 140
#define BUTTON_HEIGHT 23
#define BUTTON_SPACING 6
OperationColumnDelegate::OperationColumnDelegate(QObject *parent)
: QStyledItemDelegate{parent},
m_pViewButtonPoint(new QPushButton(tr("View"))),
m_pUsersButtonPoint(new QPushButton(tr("Users"))),
m_pOperationButtonPoint(new QPushButton(tr("details")))
{
}
void OperationColumnDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItemV4 viewOption(option);
QApplication::style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &viewOption, painter, option.widget);
int buttonNumber = 0;
int nTop = (option.rect.height() - BUTTON_HEIGHT) / 2;
QStyleOptionButton styleOptionButton;
styleOptionButton.rect = QRect(option.rect.left()+10, option.rect.top() + nTop, BUTTON_WIDTH, BUTTON_HEIGHT);
styleOptionButton.state |= QStyle::State_Enabled;
styleOptionButton.state |= QStyle::State_Active;
QPushButton *button = nullptr;
if (styleOptionButton.rect.contains(m_mousePoint))
{
switch (m_nMouseState)
{
case mouse_state_hover:
styleOptionButton.state |= QStyle::State_MouseOver;
break;
case mouse_state_pressed:
styleOptionButton.state |= QStyle::State_Sunken;
break;
}
}
if (index.column() == PlanModel::column_planContent)
{
button = m_pViewButtonPoint.data();
styleOptionButton.text = button->text();
}
else if (index.column() == PlanModel::column_userIds)
{
button = m_pUsersButtonPoint.data();
QString data = index.data().toString();
styleOptionButton.text = data;
}
else if (index.column() == PlanModel::column_operation)
{
button = m_pOperationButtonPoint.data();
styleOptionButton.text = button->text();
}
QApplication::style()->drawControl(QStyle::CE_PushButton, &styleOptionButton, painter, button);
}
bool OperationColumnDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
m_mousePoint = mouseEvent->pos();
m_nMouseState = mouse_state_none;
QApplication::restoreOverrideCursor();
int nTop = (option.rect.height() - BUTTON_HEIGHT) / 2;
QStyleOptionButton button;
button.rect = QRect(option.rect.left() + BUTTON_WIDTH/2 - BUTTON_SPACING,
option.rect.top() + nTop, BUTTON_WIDTH, BUTTON_HEIGHT);
if (button.rect.contains(m_mousePoint))
{
DdTaskInfo info = index.data(Qt::UserRole).value<DdTaskInfo>();
switch (event->type())
{
case QEvent::MouseMove:
{
m_nMouseState = mouse_state_hover;
return true;
break;
}
case QEvent::Enter:
{
m_nMouseState = mouse_state_hover;
return true;
break;
}
case QEvent::Leave:
{
m_nMouseState = mouse_state_none;
return true;
break;
}
case QEvent::MouseButtonPress:
{
if((mouseEvent->button() &Qt::LeftButton) == Qt::LeftButton)
{
m_nMouseState = mouse_state_pressed;
return true;
}
break;
}
case QEvent::MouseButtonRelease:
{
if((mouseEvent->button() &Qt::LeftButton) == Qt::LeftButton)
{
m_nMouseState = mouse_state_none;
if(index.column() == PlanModel::column_planContent)
{
QPoint mousePos = mouseEvent->pos();
QRect buttonRect = QApplication::style()->subElementRect(QStyle::SE_PushButtonContents, &option, nullptr);
if(buttonRect.contains(mousePos))
{
emit requsetView(buttonRect.topLeft(), info.description);
}
}
if(index.column() == PlanModel::column_userIds )
{
if( info.policeList.size() <=3)
{
emit requsetVideoWidget(index.row(), info.policeList);
}
else
{
QPoint mousePos = mouseEvent->pos();
QRect buttonRect = QApplication::style()->subElementRect(QStyle::SE_PushButtonContents, &option, nullptr);
if(buttonRect.contains(mousePos))
{
emit requsetShowUsers(buttonRect.topLeft(), info.policeList);
}
}
}
if(index.column() == PlanModel::column_operation)
{
emit requsetDetails(index.row(), info);
}
return true;
}
break;
}
case QEvent::MouseButtonDblClick:
{
if((mouseEvent->button() &Qt::LeftButton) == Qt::LeftButton)
{
if(index.column() == PlanModel::column_userIds && info.policeList.size() > 3)
{
emit requsetVideoWidget(index.row(), info.policeList);
}
}
}
default:
break;
}
}
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
使用
m_delegate = new OperationColumnDelegate(this);
ui->tableView->setItemDelegateForColumn(1, m_delegate);
m_delegate = new OperationColumnDelegate(this);
ui->tableView->setItemDelegateForRow(1, m_delegate);
效果
