表视图中的复选框和 itemdelegate

2023-11-25

我正在实现一个继承自 QitemDelegate 的 CheckBox,将其放入 QTableView 中。

问题是,当我插入时,我需要将其居中。

据我了解负责 Paint 的方法。我把它写成如下:

void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
bool checkValue;

QStyleOptionButton BtnStyle;
BtnStyle.state = QStyle::State_Enabled;

if(index.model()->data(index, Qt::DisplayRole).toBool() == true)
{
BtnStyle.state |= QStyle::State_On;
checkValue = true;
}else{
BtnStyle.state |= QStyle::State_Off;
checkValue = false;
}


BtnStyle.direction = QApplication::layoutDirection();
BtnStyle.rect = option.rect;
QApplication::style()->drawControl(QStyle::CE_CheckBox,&BtnStyle,painter );
QApplication::style()->drawControl(QStyle::CE_CheckBox,&BtnStyle,painter );
}

看起来居中缺少什么?

所以我有委托:

.h

class BooleanWidget : public QWidget
{
    Q_OBJECT
    QCheckBox * checkBox;

    public:
    BooleanWidget(QWidget * parent = 0)
    {
        checkBox = new QCheckBox(this);
        QHBoxLayout * layout = new QHBoxLayout(this);
        layout->addWidget(checkBox,0, Qt::AlignCenter);

    }

    bool isChecked(){return checkBox->isChecked();}
    void setChecked(bool value){checkBox->setChecked(value);}
};

class CheckBoxDelegate : public QItemDelegate
{
    Q_OBJECT
private:
    BooleanWidget *checkbox;

public:
    CheckBoxDelegate(QObject *parent);
    ~CheckBoxDelegate();
    void setEditorData( QWidget *editor,const QModelIndex &index )const;
    void setModelData( QWidget *editor,QAbstractItemModel *model,const QModelIndex &index )const;
    QWidget *createEditor( QWidget *parent,const QStyleOptionViewItem &/* option */,const QModelIndex &/* index */ )const;
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;

public slots:
    void changed( bool );

};

.cpp

void CheckBoxDelegate::changed( bool value )
{
    BooleanWidget *checkbox = static_cast<BooleanWidget*>( sender() );
    emit commitData( checkbox );
    emit closeEditor( checkbox );
}

QWidget *CheckBoxDelegate::createEditor( QWidget *parent,const QStyleOptionViewItem &/* option */,const QModelIndex &/* index */ ) const
{
  BooleanWidget *editor = new BooleanWidget( parent );
  connect( editor, SIGNAL( toggled ( bool ) ), this, SLOT( changed( bool ) ) );

  return editor;
}

void CheckBoxDelegate::setEditorData( QWidget *editor,const QModelIndex &index ) const
{
    int value = index.model()->data(index, Qt::DisplayRole).toInt();

    BooleanWidget *checkbox = static_cast<BooleanWidget*>(editor);

    if(value == 1)
    {
        checkbox->setChecked(true);
    }
    else
    {
        checkbox->setChecked(false);
    }


}

void CheckBoxDelegate::setModelData( QWidget *editor,QAbstractItemModel *model,const QModelIndex &index ) const
{
    BooleanWidget *checkBox = qobject_cast<BooleanWidget*>( editor );
    Qt::CheckState value;

    if(checkBox->isChecked())
        value = Qt::Checked;
    else
        value = Qt::Unchecked;

    model->setData( index, value, Qt::DisplayRole);
}

void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    drawCheck(painter, option, option.rect, index.data().toBool() ? Qt::Checked : Qt::Unchecked);
    drawFocus(painter, option, option.rect);
}

如果您要延长QItemDelegate类,它有一个绘制检查()函数,什么会为您绘制一个漂亮的居中复选框。您可以在 Paint() 函数中使用它。

Edit:

这是一个示例,假设您有一个名为BooleanEditor,继承自什么QItemDelegate:

void BooleanEditor::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    drawCheck(painter, option, option.rect, index.data().toBool() ? Qt::Checked : Qt::Unchecked);
    drawFocus(painter, option, option.rect);
}

为了在进入编辑模式时保持复选框居中,您可以执行以下操作:

class BooleanWidget : public QWidget
{
    Q_OBJECT
    QCheckBox * checkBox;

    public:
    BooleanWidget(QWidget * parent = 0)
    {
        checkBox = new QCheckBox(this);
        QHBoxLayout * layout = new QHBoxLayout(this);
        layout->addWidget(checkBox,0, Qt::AlignCenter);
    }

    bool isChecked(){return checkBox->isChecked();}
    void setChecked(bool value){checkBox->setChecked(value);}
};

在您的 ItemDelegates createEditor() 方法中返回此 BooleanWidget 类的实例。在 setModelData() 和 setEditorData() 中,您现在可以将输入小部件转换为此 BooleanWidget:

BooleanWidget * widget = qobject_cast<BooleanWidget*>(editor);

然后使用 is/setChecked 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

表视图中的复选框和 itemdelegate 的相关文章

随机推荐

  • ArrayList> - 如何最好地整理?

    中间有一个简单的问题 我有一个简单的 WeakRunnableList 是这样就可以清理它了 删除死引用 或者是否有更优雅和更快的解决方案 我的 WeakRunnableList 的完整源代码 public class WeakRunnab
  • Python Dataframe 根据一列中的最大值选择行

    我有一个 python 数据框 很多行 2 列 我想根据第 2 列中的最大值修改第 1 列中的唯一值 如果有帮助 第 2 列按升序排序 我可能可以编写一个循环 但更喜欢一两行解决方案 谢谢 Ex ID Value 100 11 100 14
  • 我可以使用反射来查找 ASP.NET 中的 bin/[Configuration] 文件夹而不是 asp 临时文件夹吗

    我有一个 ASP NET 网站 我想找到 bin Configuration 文件夹以使用外部工具 一个 exe 文件 当我使用反射来获取调用程序集位置时 它返回类似于以下内容的内容 C Windows Microsoft NET Fram
  • 想要在 Laravel 中实现 Web 套接字

    我想使用 Web 套接字在 Laravel 中实现 Web 通知 我有 尝试过推杆 这很简单 但它是付费套餐 我还尝试过redis和socket io 我必须安装horizo n 我正在运行 Windows 但根据我所读到的关于 Horiz
  • 部署到多个服务器

    我必须将我的 php html css etc 代码部署到多个服务器 并且我正在寻找可以轻松安全地部署到多个服务器的软件选项 如果它可以绑定到我的 SVN 中 也会有帮助 有什么建议么 卡皮斯特拉诺对此非常方便 有几个人在用 1 2 3 用
  • div背景颜色,改变悬停时的背景颜色

    我正在尝试做一个鼠标悬停时 div 的背景颜色发生变化 div 背景 白色 div a hover 背景 灰色 宽度 100 显示 块 文本装饰 无 only the link在 div 内获取背景颜色 我能做些什么来使整个div得到那个背
  • 如何在Android中调用Oauth 1.0 API?

    我正在尝试从 Android 调用基于 Oauth 1 0 身份验证的 Context io API 您能否建议我如何创建 Oauth 1 0 标准的请求 或者请任何人都可以向我提供该标准上的 Oauth 1 0 请求示例的示例代码 非常感
  • Pickle AttributeError:无法从“app.py”> 获取<模块“__main__”上的属性“Wishart”

    我已经运行代码来加载由 pickle 保存的变量 这是我的代码 import pickle last priors file open simpanan priors rb priors pickle load last priors fi
  • $(document).on("点击"...不起作用?

    我在这里可能会犯一个众所周知的错误吗 我有一个使用 on 的脚本 因为元素是动态生成的 并且它不起作用 为了测试一下 我用动态元素的换行替换了选择器 它是静态的 但它仍然不起作用 不过 当我切换到普通的旧 click 进行包装时 它起作用了
  • 如何在 Java 中检查日期的完整性

    我觉得奇怪的是 最明显的创建方式DateJava 中的对象已被弃用 并且似乎已被使用不太明显的宽松日历 替代 如何检查以日 月 年组合形式给出的日期是否有效 例如 2008 02 31 如 yyyy mm dd 将是无效日期 Key is
  • 获取 JFrame 内容的实际大小

    我得到一个 JFrame 我想显示一个带有边框的 JLabel 其填充量可能为 50px 当我将 JFrame 的大小设置为 750 750 将 JLabel 的大小设置为 650 650 将位置设置为 50 50 时 它显示得很奇怪 这是
  • 如何强制 WPF 启动窗口到特定屏幕?

    我有一个 WPF 应用程序 它将通过专用窗口显示投影仪上的信息 我想配置用于投影仪显示的屏幕以及用于主应用程序窗口的屏幕 此代码将在指定屏幕上生成投影仪输出 var screen GetProjectorScreen projectorWi
  • Apache Commons IO 文件监控与 JDK WatchService

    我需要开发一个应用程序 一旦在预定义目录中创建文件 该应用程序就会处理 csv 文件 预计会有大量传入文件 我在生产中看到过使用 Apache Commons IO 文件监控的应用程序 它运作得很好 我见过它一天处理多达 2100 万个文件
  • 在 contenteditable div 中按 Enter 键插入换行符

    当我在 contenteditable div 中按 Enter 键时 我尝试插入换行符 而不是浏览器想要插入的任何内容 我当前的代码看起来像这样 if e which 13 e stopPropagation e preventDefau
  • 通过 ADAL JavaScript Ajax 和 KnockoutJs 的 MVC AD Azure 刷新令牌

    我构建的 MVC 应用程序类型存在固有的设计缺陷 我相信我不是第一个意识到这一点的人 我有一个 MVC 4 应用程序 它利用 AD Azure 身份验证 通过以下方式引入到应用程序中 使用 Azure Active Directory 开发
  • 有没有适用于 Java 的 RFC 2397 数据 URI 解析器?

    dataurl data mediatype base64 data mediatype type subtype parameter data urlchar parameter attribute value value token q
  • 如何使用 Joda-Time 通过 EclipseLink 将 UTC 区域中的日期/时间插入 MySQL?

    我需要将 UTC 区域中的日期 时间存储到 MySQL 数据库 DATETIME 类型列 中 当用户输入日期时 它首先被转换为org joda time DateTime通过 JSF 转换器 在将此日期插入 MySQL 数据库之前 需要再次
  • 我可以停止在 Django 中渲染变量吗?

    So 我可以以某种方式停止 django 渲染特定的模板变量吗 背景是 我想在 django 应用程序中尝试 vuejs 哪种有效 问题是 两者共享相同的变量语法 所以在 vuejs 中你可以像这样声明它们 message django 模
  • 如何在Python中找到另一个函数中特定函数参数的默认值?

    假设我们有一个这样的函数 def myFunction arg1 a default value pass 我们可以使用内省来找出参数的名称myFunction 需要使用myFunction func code co varnames 但是
  • 表视图中的复选框和 itemdelegate

    我正在实现一个继承自 QitemDelegate 的 CheckBox 将其放入 QTableView 中 问题是 当我插入时 我需要将其居中 据我了解负责 Paint 的方法 我把它写成如下 void CheckBoxDelegate p