// 头文件
class MyItemDelegate :public QItemDelegate
{
public:
MyItemDelegate(QObject * parent = 0);
virtual ~MyItemDelegate(){}
void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
bool editorEvent(QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index);
void SetMainControlPoint(MainController * opMainControl);
private:
QPixmap * m_RadFlagPixmap;
QPixmap * m_notRadFlagPixmap;
MainController * m_pMainController;
};
// 源文件
MyItemDelegate::MyItemDelegate(QObject * parent) :QItemDelegate(parent), m_RadFlagPixmap(nullptr), m_notRadFlagPixmap(nullptr), m_pMainController(nullptr)
{
QString strRadarEnv = QProcessEnvironment::systemEnvironment().value("PRESAGIS_RADAR_DIR");
QString strImagePath = strRadarEnv + "\\samples\\src\\SampleControlBoard Me\\Resources";
//QString strPixmapSavePath = QDir::currentPath() + "/Resources";
m_RadFlagPixmap = new QPixmap(strImagePath + "/Flag.png");
m_notRadFlagPixmap = new QPixmap(strImagePath + "/NoFlag.png");
}
void MyItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
// 时时刻刻都在绘制红旗或者没有红旗 根据选中的是否选中
if (index.column() != 0)
{
QItemDelegate::paint(painter, option, index);
return;
}
//const int & row = index.row(); // 当前索引行 1-你目前的所有列表中的行号
//const int & col = index.column(); //永远是0 因为上边不是0的都返回了
const QAbstractItemModel * model = index.model();
QVariant var = model->data(index, Qt::CheckStateRole); //这个是下边判读当前模块是否被点击
if (var.isNull()) var = false;
std::set<string> & mSaveMonitorTargetIdSet = m_pMainController->GetMainWindow()->GetSaveMonitorTargetIDSet();
if (var.toBool()) //红旗
{
QString str = m_pMainController->GetMainWindow()->GetRadarEntityInfoTabelViewModel().item(index.row(), 1)->text();
mSaveMonitorTargetIdSet.insert(str.toStdString());
}
else //没旗
{
mSaveMonitorTargetIdSet.erase(m_pMainController->GetMainWindow()->GetRadarEntityInfoTabelViewModel().item(index.row(), 1)->text().toStdString());
}
const QPixmap & star = var.toBool() ? * m_RadFlagPixmap : * m_notRadFlagPixmap; //点击就画红旗
int width = star.width();
int height = star.height();
QRect rect = option.rect;
int x = rect.x() + rect.width() / 2 - width / 2;
int y = rect.y() + rect.height() / 2 - height / 2;
painter->drawPixmap(x, y, star); //绘制
}
bool MyItemDelegate::editorEvent(QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & /*option*/, const QModelIndex & index)
{
if (index.column() == 0 && index.row() != -1)
m_pMainController->GetMainWindow()->GetRadarEntityInfoTabelView()->setCursor(Qt::PointingHandCursor);
else
m_pMainController->GetMainWindow()->GetRadarEntityInfoTabelView()->setCursor(Qt::ArrowCursor);
QToolTip::showText(QCursor::pos(), strShowText); //点击提示
if (event->type() == QEvent::MouseButtonPress && index.column() == 0) //当前列等于0
{
//const int & row = index.row(); // 当前索引行
//const int & col = index.column(); //列
QVariant var = model->data(index, Qt::CheckStateRole);
bool isFavourite = var.toBool(); // 判断是否被点击
if (var.isValid())
{
isFavourite = isFavourite ? false : true;
}
else
{
isFavourite = true;
}
model->setData(index, isFavourite, Qt::CheckStateRole); //这块只是设置当前单元格是否被点击 然后在paint函数根据按钮是否选中来绘制红旗
return true;
}
return false;
}