显示带有“的按钮”;按「;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
信号捕获按钮上的点击,这很好。如何调整代理,使按钮在单击时看起来被按下?看起来像flagQStyle::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,这肯定是难题的一部分。下一个问题是如何让学员了解按钮单击?