问题标签 [qstyleditemdelegate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
6277 浏览

qt - How to add different types of delegates in QTreeView

I want to create same kind of QTreeView (not QTreeWidget) structure as shown in attached figure.. This is Property Editor of QT. I am using QT-4.6

enter image description here

On 2nd column, depending on different condition, I can have either a spin box, or a drop down or a checkbox or text edit... and so on... Please guide me on how to set different delegates in different cells of a particular column. From docs, it is evident that there is no straight away API for setting delegate on a cell (rather is available for full widget or a row or a column).

0 投票
1 回答
391 浏览

qt - 为什么当我单击 QTableView 单元格时它没有获得焦点?

我创建QTableView并设置了一个委托,它使用滑块编辑第 2 列中的单元格。我调用openPersistentEditor第 2 列中的所有单元格:

所以现在我有一个表格,其中第 2 列中永久显示了滑块。

我用来在 QStyledItemDelegate 的子类中创建滑块的代码是:

我的问题是我需要知道用户何时使用滑块编辑值(它应该有焦点)。我发现,如果我从左侧的表格单元格中选择滑块,滑块将成为当前返回的项目table->selectionModel()->currentIndex();但是如果我单击滑块,则当前项目不会更改。我还发现,虽然我可以从单元格左侧进入滑块,但我不能从滑块中退出。

我确信我错过了一些简单的东西,但我希望能得到一些帮助。

万一这很重要,我在其构造函数中为滑块设置了 StrongFocus,滑块QModelView列的标志是:Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled;

0 投票
2 回答
2602 浏览

qt - 如何将 QStyleOptionButton 设置为带有自定义图标的复选框

我有一个自定义Delegate类,它继承自QStyledItemDelegate. 在这种paint()情况下,我想补充一下QStyleOptionButton哪些应该是可检查的。可能吗?

例如,它表示具有眼睛图标的可见性属性;按下按钮时,眼睛图标变为闭眼图标。

paint()方法内部,这是我当前创建按钮的代码:

我加载到的图标buttonVis由以下人员创建:

在我运行程序的那一刻,该按钮有一个闭眼图标。是否有控制显示哪个图标的命令?如果我的初始布局无法实现,那么正确的方向是什么?

编辑:我发现了如何选择使用哪个图标来模拟复选框的外观。相反,如果行buttonVis.state = QStyle::State_Enabled;应该有:

现在的问题是弄清楚那个条件是什么或如何从editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index). 问题是我自己不能真正改变option,因为它是不断的参考。任何想法如何做到这一点,或如何解决它?

0 投票
2 回答
2655 浏览

python - QListView 与 CustomWIdget 使用 QStyledItemDelegate

我正在尝试创建一个QListViewwithQStyledItemDelegate以更有条理地显示数据。

我浏览了这个站点,它全部用 C++ 编写,我对此一无所知,从帖子中使用的语法和调用猜测,我尝试了实现它的方法,但我没有运气。有人可以帮我解决这个问题吗?

0 投票
1 回答
1062 浏览

qt - 如何使用多个 ProgressBars 的进度数据更新 TableView?

我已经开始扩展qGetDownloadManager以发出 a 的进度TransferItem,以便我可以连接到它。我将进度数据插入TableView模型的单元格中以显示Delegate,最后代表绘制进度条。这在理论上可行,但我遇到了以下问题

问题:当有多个并行下载时,我会从两个信号中获取进度更新到两个单元格中

在此处输入图像描述

两个进度条都显示进度数据,但信号有点混合,不是当前索引 ( QModelIndex index/ index.row()) 独有的。

(请忽略 UserRoles 之间的小转换问题(单击下载按钮后显示“ActionCell”然后“安装”,在“ProgressBar”出现之前。)。这不是这里的主要问题。我的问题是关于索引问题。)文本“112”和“113”是 int index.row

问题:

  • 如何使用多个 ProgressBars 的进度数据更新 TableView?
  • 我必须更改哪些内容才能为每次下载呈现进度条?

来源

发出下载进度

我添加了以下内容以通过类重新发出信号,直到它冒泡到顶部,在那里它可以从 GUI 连接。

  1. QNetworkReply- downloadProgress(qint64,qint64)TransferItem-的连接updateDownloadProgress(qint64,qint64)

    /li>
  2. SLOT 函数TransferItem-updateDownloadProgress(qint64,qint64)接收方计算进度并将其存储在progress( QMap<QString, QVariant>) 中。计算后downloadProgress(this)发出信号。

    /li>
  3. 当新的下载入队时,我将发射连接 downloadProgress(this)到 Slot DownloadManager- downloadProgress(TransferItem*)。(dlDownloadItem扩展TransferItem)。

    /li>
  4. 最后,我再次发送下载进度:

    /li>

现在带有 Delegate、doDownload(index) 和 ProgressBarUpdater 的 TableView

  1. QTableView
  2. 添加QSortFilterProxyModel(不区分大小写)
  3. 添加了ColumnDelegate,它根据自定义 UserRoles 呈现 DownloadButton 和 ProgressBar。委托处理按钮单击:downloadButtonClicked(index)editorEvent(event, model, option, index)方法发出信号。

    /li>
  4. doDownload方法接收index并从模型中获取下载 URL。然后将 URL 添加到 DownloadManager 中,我正在设置 ProgressBarUpdater 对象以将进度数据设置为给定索引处的模型。最后,我连接downloadManager::signalProgressprogressBar::updateProgress调用downloadManager::checkForAllDone以开始下载处理。

    /li>
  5. 模型更新部分:ProgressBarUpdater 获取索引和进度,并应在给定索引处更新模型。

    /li>
  6. 渲染部分:我正在渲染来自委托的假 ProgressBar;使用 获取进度数据index.model()->data(index, DownloadProgressBarRole)

    /li>

我已添加QString::number(index.row()到进度条文本,以便每个 ProgressBar 都呈现其行号。换句话说:渲染对于行来说是唯一的,但是传入的进度数据以某种方式混合在一起。

我在索引问题上停留了一段时间。预先感谢您的帮助。

更新:问题已解决!

非常感谢ddriver!!我遵循了您的建议并修复了它:

在此处输入图像描述

0 投票
2 回答
5857 浏览

qt - QStyledItemDelegate:如何使复选框按钮在单击时更改其状态

我有一个MyDelegate用于QListWidget. 委托派生自QStyledItemDelegate. 的目标之一MyDelegate是在 的每一行上放置一个复选框按钮ListWidget。它是在以下paint()事件中完成的MyDelegate

起初我以为复选框会在单击时自动更改其状态,因为我指定了QStyle::CE_CheckBox. 但事实并非如此。看起来我必须手动指定复选框的视觉行为。

数据方面,当用户单击该复选框时,会发出某些信号并更改场景数据。我在执行此操作editorEvent()

后端部分工作。但是,我不知道如何使复选框按钮将其视觉状态从选中更改为未选中,然后向后更改。

我意识到我可以通过以下方式手动更改复选框状态paint()

QStyle::State_On/Off手动复选框状态改变的技巧。

但我不知道如何设置它someCondition以及我应该在哪里设置它。我试图将它作为一个私有bool变量引入,editorEvent()当复选框区域被点击时,它将被设置,但是,它不会产生所需的行为:它设置了所有其他复选框ListWidget为相同的视觉状态。因此,它的行为类似于所有复选框的某种全局条件。

我觉得,要完成我的任务,我必须重新实现按钮并使其在单击时更改复选框状态。但是我迷路了,不知道如何解决这个问题。从QStyleOptionButtonAPI我看不到clicked()我可以使用的任何其他方法。

所以,问题是:如何使复选框在视觉上表现得像一个复选框?如果我需要重新实现一个复选框,那么我应该继承什么类?

0 投票
0 回答
133 浏览

c++ - Qt TableWidget - 单击单元格时出现的图像

我使用带有两列的 QTableWidget。第一列显示图像。第二列显示文本。我调用QBrush::setTexture的是第一列,而不是setIcon函数。

我希望在单击其单元格时更改第一列图像,但是单击单元格时出现的图像存在问题。

这是我期望的图像:
这是我期望的图像

这是我得到的图像:
这是我得到的图像

这是代码

.h 文件

.cpp 文件

代表似乎有问题,但我不知道如何解决。请帮我。

0 投票
1 回答
2333 浏览

python - QCompleter的弹出列表的列表项如何正确格式化?

我想研究如何制作一个小型用户界面,用户可以在其中键入一些字母并根据给定的数据源(此处列出)获得一些建议,从而使搜索更容易。为此,我正在使用 Qt 的QCompleter课程。

在匹配元素中,键入的字母应使用 HTML 突出显示,如以下代码中的示例Au<b>st</b>ria:最后,我将一些 SO 答案(参见How to make item view render rich (html) text in Qt)和教程合并到一个小的独立模块中:

我的问题是用户 Timo 在答案https://stackoverflow.com/a/5443112/1504082中的建议:

在 line: 'doc.setHtml(options.text)' 之后,您还需要设置 doc.setTextWidth(option.rect.width()),否​​则代理将无法正确呈现相对于目标绘图区域的较长内容。例如不在 QListView 中换行。

所以我这样做是为了避免在完成者的弹出窗口中裁剪长文本。但我得到以下输出: 这个垂直边距从何而来?

这个额外的垂直边距从何而来?

我对此进行了一些调查,发现有时使用包含具有属性的矩形的参数调用 的sizeHint方法。并且显示行为最终在调用. 但我最终无法找出是谁用这个参数调用它以及如何正确解决这个问题。HTMLDelegateoptions(0, 0, 0, 0)doc.setTextWidth(options.rect.width())

有人可以解释这是从哪里来的,我该如何正确地解决这个问题?

0 投票
0 回答
561 浏览

qt - 如何让 QTreeView 重新计算行高?

QTreeViewsubclassedQAbstractItemModel和 custom QStyledItemDelegate。考虑到文本换行,自定义委托的sizeHint重新实现并返回计算出的正确单元格高度。

所以问题是单元格的高度在列调整大小时没有改变。如何强制QTreeView重新计算他​​的细胞高度?我可以使用信号QHeaderView::sectionResized来检测单元格调整大小,但是如何QTreeView调整单元格高度?

0 投票
1 回答
1118 浏览

qt - Qt5 子类化 QStyledItemDelegate 格式

我正在为 Qt5 中的 SQLite 数据库开发 GUI。我使用QSqlQueryModelandQTableView来存储和显示数据。

然后,我创建了一个自定义委托,使用 switch 语句将某些列的数值替换为表视图中的文字(例如 1 = "Hello", 2 = "World")。

委托按应有的方式显示数据并正常工作。但是,自定义委托绘制的列与默认的绘制方法相比具有不同的格式QStyledItemDelegate。值在左上角而不是左中,更改后的列不再自动扩展列以显示完整值,并且列中的单元格在选择时不会变为蓝色或具有虚线轮廓。

我创建了这个示例程序:

options.displayAlignment这通过添加到painter->drawText();来修复文本对齐。我还在if(option.state & QStyle::State_Selected)根据其选择状态绘制单元格的语句中添加了附加代码。因此,如果未选中,则文本为黑色,如果选中,则文本变为白色,背景变为蓝色。但是,我仍然无法让列扩展以适应单元格的内容,或者在单元格外部添加一条虚线,就像使用标准委托一样。

使用我的自定义绘制方法时,是否有一种简单的方法可以保持表格视图的默认样式?