void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if(index.isValid()) { if(option & QStyle::State_MouseOver) { // Курсор мыши наведен на элемент } }}
C++ (Qt)void QAbstractItemView::setDropIndicatorShown( bool enable )
QMimeData* data = QAbstractTableModel::mimeData(indexes);
void MatrixDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { /* Если в данный момент происходит перетаскивание выделенных ячеек, * Обрамлять активную область сброса границей */ if(_isDraggedModeEnabled()) { // ... }}
QItemSelectionModel * QAbstractItemView::selectionModel() const
//---------------------------------------------------------------------------------------void MatrixDelegate::setRegionBorder(int upper_row, int left_column, int bottom_row, int right_column) { _left_border_column_idx = left_column; _upper_border_row_idx = upper_row; _right_border_column_idx = right_column; _bottom_border_row_idx = bottom_row;}//---------------------------------------------------------------------------------------void MatrixDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if(index.isValid()) { int cell_row = index.row(); int cell_column = index.column(); /* Проверить, не является ли ячейка границей региона, к которому применяется обрамление */ if(_isCellHasLeftBorder(cell_row, cell_column)) { // Отрисовать границу слева _drawLeftCellBorder(painter, option); } if(_isCellHasUpperBorder(cell_row, cell_column)) { // Отрисовать границу сверху _drawUpperCellBorder(painter, option); } if(_isCellHasRightBorder(cell_row, cell_column)) { // Отрисовать границу справа _drawRightCellBorder(painter, option); } if(_isCellHasBottomBorder(cell_row, cell_column)) { // Отрисовать границу снизу _drawBottomCellBorder(painter, option); } QStyledItemDelegate::paint(painter, option, index); }}//---------------------------------------------------------------------------------------bool MatrixDelegate::_isCellHasLeftBorder(int row, int column) const { bool is_cell_between_horizontal_borders = ( (_upper_border_row_idx <= row) && (row <= _bottom_border_row_idx) ); bool is_cell_lays_onto_left_edge = ( column == _left_border_column_idx ); return ( is_cell_between_horizontal_borders && is_cell_lays_onto_left_edge );}//---------------------------------------------------------------------------------------/* и.т.д. по аналогии *///---------------------------------------------------------------------------------------void MatrixView::dragMoveEvent(QDragMoveEvent *evt) { QModelIndex index_under_cursor = indexAt(evt->pos()); int current_row = index_under_cursor.row(); int current_column = index_under_cursor.column(); QItemSelectionRange selected_range = selectionModel()->selection().first(); int upper_row = selected_range.top(); int bottom_row = selected_range.bottom(); int left_column = selected_range.left(); int right_column = selected_range.right(); int selection_width = right_column - left_column; int selection_height = bottom_row - upper_row; _matrix_delegate->clearRegionBorder(); _matrix_delegate->setRegionBorder(current_row, current_column, current_row + selection_height, current_column + selection_width); QTableView::dragMoveEvent(evt);}