在 tableWidget 中,我有一列完全由可检查项目组成。我不知道如何使复选框居中或至少删除它旁边的文本框。正如您在这张图片上看到的那样,当我单击单元格时,文本框的轮廓很丑陋,如果可能的话,我希望在整个表格中关闭它。我读过我需要使用代表来控制项目/图标的定位,但是对于像我这样的nooby来说,理解这一点需要很长时间,所以如果有一些简单的解决方案可以使该列不那么难看,请,示例将不胜感激。
问问题
12413 次
3 回答
9
一个使用 pyqt4 的例子。改编自falsinsoft
table = QTableWidget()
cell_widget = QWidget()
chk_bx = QCheckBox()
chk_bx.setCheckState(Qt.Checked)
lay_out = QHBoxLayout(cell_widget)
lay_out.addWidget(chk_bx)
lay_out.setAlignment(Qt.AlignCenter)
lay_out.setContentsMargins(0,0,0,0)
cell_widget.setLayout(lay_out)
tableWidget.setCellWidget(i, 0, cell_widget)
于 2015-05-10T12:49:21.077 回答
6
用法:
pView->setItemDelegateForColumn( 1, new DELEGATE::CheckBoxDelegate( this ) );
CheckBoxDelegate.h
#ifndef CHECKBOXDELEGATE_H
#define CHECKBOXDELEGATE_H
#include <QStyledItemDelegate>
#include <QModelIndex>
namespace DELEGATE
{
class CheckBoxDelegate
: public QStyledItemDelegate
{
Q_OBJECT
public:
CheckBoxDelegate( QObject *parent );
~CheckBoxDelegate();
void paint( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
bool editorEvent( QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index );
private:
QModelIndex m_lastClickedIndex;
};
}
#endif // CHECKBOXDELEGATE_H
CheckBoxDelegate.cpp
#include "CheckBoxDelegate.h"
#include <QApplication>
#include <QStyleOptionButton>
#include <QPainter>
#include <QEvent>
#include <QMouseEvent>
namespace DELEGATE
{
CheckBoxDelegate::CheckBoxDelegate( QObject *parent )
: QStyledItemDelegate( parent )
{
}
CheckBoxDelegate::~CheckBoxDelegate()
{
}
void CheckBoxDelegate::paint( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
// Setting parameters
Qt::CheckState state = (Qt::CheckState)index.data( Qt::CheckStateRole ).toInt();
QStyleOptionButton opt;
opt.state = QStyle::State_Enabled; // CheckBox enabled
if ( option.state & QStyle::State_MouseOver )
opt.state |= QStyle::State_MouseOver; // Mouse over sell
switch ( state ) // Check box state
{
case Qt::Unchecked:
opt.state |= QStyle::State_Off;
break;
case Qt::PartiallyChecked:
opt.state |= QStyle::State_NoChange;
break;
case Qt::Checked:
opt.state |= QStyle::State_On;
break;
}
// Check box rect
opt.rect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &opt, NULL );
const int x = option.rect.center().x() - opt.rect.width() / 2;
const int y = option.rect.center().y() - opt.rect.height() / 2;
opt.rect.moveTo( x, y );
// Optional: draw hover focus
if ( option.state & QStyle::State_MouseOver )
painter->fillRect( option.rect, QBrush( QColor( 0xff, 0xff, 0xaa, 0x60 ) ) );
// Mandatory: drawing check box
QApplication::style()->drawControl( QStyle::CE_CheckBox, &opt, painter );
}
bool CheckBoxDelegate::editorEvent( QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index )
{
switch ( event->type() )
{
case QEvent::MouseButtonPress:
m_lastClickedIndex = index;
break;
case QEvent::MouseButtonRelease:
{
if ( index != m_lastClickedIndex )
break;
QMouseEvent *e = static_cast< QMouseEvent * >( event );
if ( e->button() != Qt::LeftButton )
break;
m_lastClickedIndex = QModelIndex();
QStyleOptionButton opt;
opt.rect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &opt, NULL );
const int x = option.rect.center().x() - opt.rect.width() / 2;
const int y = option.rect.center().y() - opt.rect.height() / 2;
opt.rect.moveTo( x, y );
if ( opt.rect.contains( e->pos() ) )
{
// TODO: process click on checkbox logic
Qt::CheckState state = (Qt::CheckState)index.data( Qt::CheckStateRole ).toInt();
switch ( state )
{
case Qt::Unchecked:
state = Qt::PartiallyChecked;
break;
case Qt::PartiallyChecked:
state = Qt::Checked;
break;
case Qt::Checked:
state = Qt::Unchecked;
break;
}
model->setData( index, state, Qt::CheckStateRole );
}
return true;
}
default:
break;
}
return QAbstractItemDelegate::editorEvent( event, model, option, index );
}
}
样本:
需要改进的主题:
- 选择图
- 鼠标悬停处理
- 双击处理
- 键盘编辑事件//google中有很多例子,stackoverflow
注意:您的模型应该为 Qt::CheckStateRole 角色处理 setData 方法。
于 2013-04-30T13:37:54.120 回答
5
该矩形是一个焦点调整,不能通过样式表隐藏。
编辑:所以你有四个选择:
1 - 看来你可以使用
tablewidget->setFocusPolicy(Qt::NoFocus);
但是您将失去处理键盘事件的能力。请参阅焦点政策
2 - 将可检查的小部件设置为禁用,不能通过setFlags选择。我不知道这是否是一个错误,但在我的 Qt 中,我仍然可以点击复选框
3 - 通过setFlags也将您的第一列设置为可检查,并且不要使用第二列。复选框将显示在与字符串相同的列中,但在左侧。
4-您不想创建的自定义委托。
于 2013-04-29T10:45:20.377 回答