我有一个QTableView与QSqlTableModel连接.
在第一列中,只有这种格式的日期:2010-01-02
我希望此列以此格式显示日期(但不更改实际数据):02.01.2010
我知道我必须为此列创建一个QItemDelegate,但我不知道我知道如何读取现有数据并用不同的东西覆盖它.你知道如何管理它吗?
我正在尝试在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) 我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的子类化,
这是一个使用子类的最小代码,并显示了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) 我在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()中获取当前单元格宽度?
我正在做一个继承自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 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。
我正在寻找在 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++ 中有什么方法可以做到这一点?
我想创建如图所示的相同类型的 QTreeView(不是 QTreeWidget)结构。这是 QT 的属性编辑器。我正在使用 QT-4.6
在第二列,根据不同的条件,我可以有一个旋转框、一个下拉框、一个复选框或一个文本编辑……等等……请指导我如何在不同的单元格中设置不同的代表特定列。从文档中,很明显没有直接的 API 可以在单元格上设置委托(而是可用于完整的小部件或行或列)。
在我的一个项目中,我使用 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) qitemdelegate ×10
qt ×8
qtableview ×4
pyqt ×3
python ×3
c++ ×2
border ×1
model-view ×1
paint ×1
qcheckbox ×1
qt4 ×1
qt5 ×1
qtextedit ×1
qtreeview ×1
qwidget ×1