标签: qitemdelegate

使用QItemDelegate在QTableView中显示其他数据

我有一个QTableView与QSqlTableModel连接.
在第一列中,只有这种格式的日期:2010-01-02
我希望此列以此格式显示日期(但不更改实际数据):02.01.2010
我知道我必须为此列创建一个QItemDelegate,但我不知道我知道如何读取现有数据并用不同的东西覆盖它.你知道如何管理它吗?

c++ qt qt4 qtableview qitemdelegate

6
推荐指数
2
解决办法
8186
查看次数

Qt QTableView在活动单元格周围绘制边框

我正在尝试在QTableView中实现类似Excel的行为,其中边框绘制在整个当前选择周围.我尝试了这种感觉就像一百种不同的方式,并不断遇到问题.我可以很容易地绘制边框,但只要选择更改,就会留下边框的残余.这是我在QTableView :: paintEvent中尝试过的一个例子......


void MyTableView::paintEvent(QPaintEvent* event)
{
    // call QTableView's paint event first so we can draw over it
    QTableView::paintEvent(event);

    // activeSelection is a list of indexes that is updated in another function
    // the function also calls QTableView::repaint whenever this list changes
    // in an attempt to erase the previously drawn border
    if(!activeSelection.size())
        return;

    QRect rect = visualRect(activeSelection.at(0)) |
           visualRect(activeSelection.at(activeSelection.size() - 1));
    // temporarily draw smaller border so it doesn't lie on the grid lines
    rect.adjust(4, 4, -4, -4); …
Run Code Online (Sandbox Code Playgroud)

qt border qtableview qitemdelegate

6
推荐指数
1
解决办法
3403
查看次数

有条件地更改连接到QFileSystemModel的QListView中的文件颜色

QListView有一个QFileSystemModel.根据a中的选择QTreeView,QListView显示文件夹的内容.
现在我需要根据某些条件更改文件名的颜色.
最初的想法是迭代QListView中的项目,并根据条件是否满足来设置每个项目的颜色.然而这似乎是不可能的,因为只接受改变的setData()方法,忽略像[见这个 ]的 东西QFileSystemModelEditRole

self.FileModel.setData(index, QtGui.QBrush(QtCore.Qt.red), role=QtCore.Qt.ForegroundRole)
Run Code Online (Sandbox Code Playgroud)

这也被指出了这里 ,并在后者的建议是,子类QItemDelegate用于着色的而QListView项目的目的.

因此,如果满足条件,我将子类化QStyledItemDelegate并重新实现其paint()方法以绿色显示文件名 - 这很好.然而它现在看起来有点丑陋:文件图标丢失,"mouse_over"效果不再起作用.

虽然这个子类化无论如何都是一个混乱的解决方法,但我的顶级问题是

  • 有没有办法根据条件为QListView连接的项目着色QFileSystemModel

现在规定可能不是这种情况并且坚持QItemDelegate的子类化,

  • 有没有办法通过漂亮的选择和图标来恢复原始行为?
  • 有谁知道哪个ItemDelegate最初用于QListView中的QFileSystemModel以及如何使用它?
  • 是否可以获取其源代码并从那里复制paint方法?

这是一个使用子类的最小代码,并显示了descibed行为.它使用QLineEdit可以键入字符串的位置,以便包含该字符串的所有文件都以绿色突出显示.

import sys
from PyQt4 import QtGui, QtCore


class MyFileViewDelegate(QtGui.QStyledItemDelegate ):
    def __init__(self, parent=None, *args, **kwargs):
        QtGui.QItemDelegate.__init__(self, parent, *args)

        self.condition = None
        self.isMatch = False

        self.brush_active =         QtGui.QBrush(QtGui.QColor("#79b9ed"))
        self.brush_active_matched = QtGui.QBrush(QtGui.QColor("#58cd1c"))
        self.pen =                  QtGui.QPen(QtGui.QColor("#414141") ) …
Run Code Online (Sandbox Code Playgroud)

python pyqt qitemdelegate qfilesystemmodel

6
推荐指数
1
解决办法
549
查看次数

如何在QItemDelegate sizeHint()中获取QTreeView单元格宽度?

我在QTreeView中有一个自定义QItemDelegate绘图文本.在paint()中,我从样式中获取单元格的大小.然后我使用wordwrap使用当前单元格的宽度绘制文本.

在sizeHint()中,我真的只想计算高度.宽度应该是当前单元格宽度.当用户更改单元格宽度时,sizeHint将只计算单词包装文本的新高度并返回该高度.

问题是我无法像在paint()中那样获取sizeHint()中的单元格宽度.我用的是:

style = QApplication.style()
style.subElementRect(QStyle.SE_ItemViewItemText, option).width()
Run Code Online (Sandbox Code Playgroud)

这适用于paint(),但在sizeHint()中返回-1.如何在sizeHint()中获取当前单元格宽度?

python qt pyqt paint qitemdelegate

5
推荐指数
1
解决办法
2718
查看次数

tableview中的checkbox和itemdelegate

我正在做一个继承自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 );
}
Run Code Online (Sandbox Code Playgroud)

什么缺少出现居中?

所以我有委托:

.H

class BooleanWidget : public QWidget
{
    Q_OBJECT
    QCheckBox * checkBox;

    public:
    BooleanWidget(QWidget * parent = 0)
    {
        checkBox = new QCheckBox(this);
        QHBoxLayout * layout = new …
Run Code Online (Sandbox Code Playgroud)

qt qtableview qitemdelegate qcheckbox

5
推荐指数
2
解决办法
1万
查看次数

带有自定义视图小部件的 QItemDelegate

Qt 5.5 有一个虚拟方法来定义编辑模式的自定义小部件:

QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem & option ,const QModelIndex & index ) const
Run Code Online (Sandbox Code Playgroud)

但是如何使用自定义小部件来覆盖“查看”模式呢?我看到了“星级评级”委托示例,其中paint使用了方法,但这不是我需要的。我需要显示一个自定义小部件,其中包含其他标准小部件,并在QTableView或 的视图模式下使用它QListView。无需搞乱绘制指针和数字 - 只需显示一个自定义小部件(具有 .ui 文件)并包含其他标准小部件及其行为。

例如:有一个下载管理器应用程序,可以将下载显示为表格或列表视图。QListView带有下载列表。每个下载都有 URL、标题、总大小、下载大小、进度栏、暂停按钮、删除按钮、恢复按钮。所有这些都可以是表格 ( QTableView) 中的列,也可以类似于 HTML 的 DIV 那样组合在一个单元格中(QListView小部件)

如何实现?有类似的东西QWidget *createViewer(...吗?

QtWidgets 不使用 QML。

qt qitemdelegate model-view qt5

5
推荐指数
1
解决办法
1495
查看次数

PyQt:在 QStyledItemDelegate 中使用 QTextEdit 作为编辑器

我正在寻找在 QStyledItemDelegate 中使用多行文本编辑的干净方法。createEditor 的实现非常简单,返回一个 QTextEdit 实例

def createEditor(self, parent, option, index):
    return QtGui.QTextEdit("Some text")
Run Code Online (Sandbox Code Playgroud)

setModelData期望派生出一个 Edit WidgetQWidget作为参数而不是QTextEditsbase QScrollArea。Qt 文档还告诉我(至少在 PyQt 文档中)该setModelData函数尝试从 QWidget UserData 字段获取数据。但是,如果没有派生的编辑小部件,QWidget则无法设置数据。目前它抛出一个,因为它在编辑器上AttributeError找不到。text()

是否有一些行之有效的方法来使用非 QWidget 编辑器?或者我只是缺少一些小部件来做到这一点?

目前,我通过实例化 aQLineEdit并将其QTextEdit传递toPlainText()给 来快速解决了该问题setModelData。非常哈克!!我还可以使用鸭子类型并在派生类上实现一个text()方法QTextEdit。但这仍然不是一个好方法,不是吗?在 C++ 中有什么方法可以做到这一点?

python pyqt qitemdelegate qtextedit qstyleditemdelegate

3
推荐指数
1
解决办法
2340
查看次数

如何在 QTreeView 中添加不同类型的委托

我想创建如图所示的相同类型的 QTreeView(不是 QTreeWidget)结构。这是 QT 的属性编辑器。我正在使用 QT-4.6

在此处输入图片说明

在第二列,根据不同的条件,我可以有一个旋转框、一个下拉框、一个复选框或一个文本编辑……等等……请指导我如何在不同的单元格中设置不同的代表特定列。从文档中,很明显没有直接的 API 可以在单元格上设置委托(而是可用于完整的小部件或行或列)。

qt qitemdelegate qtreeview qstyleditemdelegate

3
推荐指数
1
解决办法
5896
查看次数

使用 QStyledItemDelegate 子类在 QTableView 中创建按钮

我有完全相同的问题,但我将使用 QTableView 小部件。我读了这篇文章,想知道是否可以覆盖 createEditor 函数以使用例如 QFileDialog 来获取新数据。

如果这是可能的,任何人都可以为我提供一个示例来实现 QItemDelegate 的子类。

如果没有,任何人都可以向我提供一个示例来实现 QItemDelegate 的子类,女巫可以在 QLineEdit 旁边绘制一个按钮以获取此处的功能。

编辑:也许这个问题真的很愚蠢,我没有意识到,因为我离开了这个项目大约半年。

第二:从Qt 5.7升级到5.8安全吗?

qt qtableview qitemdelegate

3
推荐指数
1
解决办法
6016
查看次数

QStyledItemDelegate 绘制自定义小部件失败

在我的一个项目中,我使用 aQTableWidget来显示一些复杂的计算结果。为了提高表格的可读性,我需要在单个表格单元格内显示两个对齐的值。

稍后我想通过使用颜色或箭头等更多地自定义小部件。

为此,我从中得出QStyledItemDelegate并调用table ->setItemDelegate(new TwoNumbersDelegate)了我的QTableWidget实例。

由于某些原因,QFrame永远不会显示。我真的尝试了一切。奇怪的是,调用drawLine给出了一些结果,但只在顶部的左侧单元格中。

我的想法是,调用mFrame->render(...)不是正确的方法,但正确的方法是什么?

我的包含文件是:

#pragma once

#include <QStyledItemDelegate>
class QLabel;

    class TwoNumbersDelegate : public QStyledItemDelegate {
    public:
        TwoNumbersDelegate(QObject* parent = nullptr);

        virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

        virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;

    private:
        QLabel* mLeft;
        QLabel* mRight;
        QFrame* mFrame;
    };
Run Code Online (Sandbox Code Playgroud)

我的cpp文件是:

#include "TwoNumbersDelegate.h"
#include <QLabel>
#include <QPainter>
#include …
Run Code Online (Sandbox Code Playgroud)

c++ qt qwidget qitemdelegate qstyleditemdelegate

3
推荐指数
1
解决办法
1438
查看次数