Похоже, флаг QStyle::State_Sunken
делает кнопку визуально нажатой. Поэтому попробуйте
buttonOption.state = QStyle::State_Enabled | QStyle::State_Sunken;
РЕДАКТИРОВАТЬ:
Вы можете реализовать нажатие кнопки, нарисованное делегатом с изменением данных QTableWidgetItem
(если оно было создано ранее). Например, давайте используем Qt::CheckStateRole
для передачи нажатого состояния (или используем любую другую роль, например Qt:UserRole + 1
). В этом случае ваш paint
метод будет
void WidgetPixmapDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionButton buttonOption;
bool isPressed = index.data(Qt::CheckStateRole).toBool();
if (isPressed)
{
buttonOption.state = QStyle::State_Enabled | QStyle::State_Sunken;
}
else
{
buttonOption.state = QStyle::State_Enabled;
}
buttonOption.text = "Text";
buttonOption.rect = option.rect.adjusted(1, 1, -1, -1);
QApplication::style()->drawControl(QStyle::CE_PushButton, &buttonOption, painter);
}
Поэтому, когда вы установите Qt::CheckStateRole
, кнопка данных будет окрашена как нажатая.
Для обработки мышиных подклассов событий QTableWidget
и переопределите события мыши, которые вам нужны.
class ClickTableWidget : public QTableWidget
{
Q_OBJECT
public:
explicit ClickTableWidget(QWidget *parent = 0);
protected:
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
signals:
public slots:
};
void ClickTableWidget::mousePressEvent(QMouseEvent *event)
{
QTableWidgetItem *item = itemAt(event->pos());
if (item)
{
//check column item->column()
item->setData(Qt::CheckStateRole, true);
}
}
void ClickTableWidget::mouseReleaseEvent(QMouseEvent *event)
{
QTableWidgetItem *item = itemAt(event->pos());
if (item)
{
item->setData(Qt::CheckStateRole, false);
}
}
Конечно, это примитивный пример, он не проверяет поведение перетаскивания, кнопки мыши и не реализует анимацию при наведении курсора.