Показать кнопку pu sh с состоянием "нажато" в QTableView - PullRequest
1 голос
/ 17 января 2020

Я создал делегата для отображения кнопок pu sh в табличном представлении. Это выглядит так (последние два столбца): enter image description here

Вот код метода делегата paint:

void PushButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                               const QModelIndex &index) const
{
    QStyleOptionButton buttonOption;
    buttonOption.state = QStyle::State_Enabled;
    buttonOption.text = this->text;
    buttonOption.rect = option.rect.adjusted(1, 1, -1, -1);
    QApplication::style()->drawControl(QStyle::CE_PushButton, &buttonOption, painter);
}

Я использую clicked табличное представление таблицы захватывает щелчки на кнопках, и это прекрасно работает. Как настроить делегата так, чтобы при нажатии на него кнопки выглядели нажатыми?

1 Ответ

1 голос
/ 18 января 2020

Похоже, флаг 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);
    }
}

Конечно, это примитивный пример, он не проверяет поведение перетаскивания, кнопки мыши и не реализует анимацию при наведении курсора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...