显示带有“的按钮”;按「;QTableView中的状态

显示带有“的按钮”;按「;QTableView中的状态,qt,Qt,我创建了一个代理,用于在表视图中显示按钮。如下所示(最后两列): 以下是学员的paint方法的代码: void PushButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionButton buttonOption;

我创建了一个代理,用于在表视图中显示按钮。如下所示(最后两列):

以下是学员的
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
信号捕获按钮上的点击,这很好。如何调整代理,使按钮在单击时看起来被按下?

看起来像flag
QStyle::State\u denken
使按钮在视觉上被按下。所以试试看

buttonOption.state = QStyle::State_Enabled | QStyle::State_Sunken;
编辑:

您可以通过更改
QTableWidgetItem
(如果以前创建过)的数据来实现代理绘制的按钮单击。例如,让我们使用
Qt::CheckStateRole
传递按下的状态(或者使用任何其他角色,如
Qt:UserRole+1
)。在这种情况下,您的
绘制方法将是

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);
    }
}

当然,这是一个基本示例,它不检查拖动行为、鼠标按钮,也不执行悬停动画。

谢谢Serhiy,这肯定是难题的一部分。下一个问题是如何让学员了解按钮单击?