我正在编写PyQt应用程序,但在创建自定义列表视图时遇到了一些麻烦.我希望列表包含任意小部件(特别是一个自定义小部件).我该怎么做?
似乎替代方案是创建一个包含在滚动条中的表格或网格视图.但是,我希望能够利用模型/视图方法以及嵌入(树视图)支持内置函数句柄.
为了澄清,自定义小部件是交互式的(包含按钮),因此解决方案不仅仅需要绘制小部件.
我需要能够在a的表行中有一个按钮/链接QTableView.这是打开一个对话框,以便更有效地编辑该行.
经过几个小时的网络搜索,我还没有找到一个体面的例子.
我知道这很可能是使用a来完成的QItemDelegate,但我不确定如何在行中创建一个功能小部件,而不必先将项目强制转换为编辑模式.
任何帮助将不胜感激.
假设我需要显示一个项目列表.每个项目都包含一个QPushButton图像和一些文本.当用户点击按钮时会发生某些事情(即我需要获取信号).在Qt中实现这个的正确方法是什么?
经过一些阅读,我明白如果我使用QListWidget和QListWidgetItem,这可以实现.我可以根据我的需要对每个QListWidgetItem进行子类化,并在列表小部件中设置它们.
但是,我还读到一个更合适的方法(MOdel View方法)是使用QlistView和QItemDelegate.但如果我使用QItemDelegate,似乎我只能绘制小部件.如何获得按钮事件?
对不起这篇巨大的帖子.我对何时使用QListWidget/QListView的整个概念感到困惑.
我按照Qt提供的Spin Box Delegate教程,尝试实现自己的QItemDelegate.它将用于指定a QComboBox来表示QTableView单元格中的数据,但它不起作用.
我最大的问题是我不知道什么时候QItemDelegate会被利用.
何时itemModel->setData()使用或何时使用itemModel->setItem().我怀疑setItem()是因为我重新实现了QItemDelegate(强调"项目"),但教程使用setData()并且它工作正常.
我知道,如果指定QItemDelegate不起作用,它使用默认值,但我现在怎么说我指定的那个不起作用?
什么时候我应该怀疑QTableView使用我的代表.我想指定每个单元格使用哪些代理.这是可能的还是QTableView唯一使用一个代表?
如何将我指定的项目来填充QComboBox一旦获得通过所显示的QTableView?
我QItemDelegate在这里实现:
QComboBox位于mainwindow.cpp中的注释"Enabled"下面.qcomboboxitemdelegate.h
#ifndef QCOMBOBOXITEMDELEGATE_H
#define QCOMBOBOXITEMDELEGATE_H
#include <QItemDelegate>
#include <QComboBox>
class QComboBoxItemDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit QComboBoxItemDelegate(QObject *parent = 0);
QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index);
void setEditorData(QWidget *editor, const QModelIndex &index);
void …Run Code Online (Sandbox Code Playgroud) 这两个类都为模型中的数据项提供显示和编辑工具.QStyledItemDelegate 是更新和关于QItemDelegate状态的Qt文档:
请注意,QStyledItemDelegate已经接管了绘制Qt项目视图的工作.我们建议在创建新委托时使用QStyledItemDelegate.
我很困惑这两者之间的区别是什么,为什么QStyledItemDelegate首选QItemDelegate!
我或多或少了解MPV是如何工作的.但我没有得到什么课:
QAbstractItemModelQAbstractItemViewQAbstractItemDelegate/QItemDelegate可以帮我吗?
如果这是相关的,我使用
QGraphicsScene/ QGraphicsView与一些元素(游戏板的可视化表示),用户可以交互,而交互逻辑(游戏规则)被封装在其他类中.
我有一个QTableView,我想在编辑模式下显示最后一列.(这是一个QComboBox,用户应该能够始终更改值.)
我想我已经在Qt文档中看到了解决方案,但我再也找不到了.有一个简单的方法吗?
我想我可以通过使用openPersistentEditor()每个单元格来存档这种效果,但我正在寻找更好的方法.(比如只为整列指定一次.)
我想显示一个QListView,其中每个项目都是带有一些标签的复选框.复选框应始终可见.我能想到的一种方法是使用自定义委托和QAbstractListModel.有更简单的方法吗?你能提供最简单的代码片段吗?
提前致谢
我有一个QListView,我使用自定义绘图显示项目.在每个项目(即每个列表行)中,我希望能够显示一些用户可以单击的"超链接",然后调用某些功能.
我已经尝试检查官方文档(例如模型/视图编程)以及相当多的谷歌搜索,但还没有弄清楚如何实现这一目标.
我有两个想法,每个都有自己的问题:
我最初的方法是使用QListWidget和.setItemWidget(),其中我有一个带有布局和子窗口小部件的正确小部件.不幸的是,当我的列表增加到数百或数千个项目时,这太慢了.这就是我用委托更改为QListView的原因.
嗨,大家好.我已经制作了一个自定义小部件QLineEdit和几个QPushButtons用于自定义项委托的小部件:
class LineEditor : public QWidget
{
public:
explicit LineEditor(QWidget *parent = 0) : QWidget(parent) {
setLayout(new QHBoxLayout);
layout()->setContentsMargins(0, 0, 0, 0);
layout()->setSpacing(0);
QLineEdit *edit = new QLineEdit(this);
layout()->addWidget(edit);
layout()->addWidget(new QPushButton(this));
layout()->addWidget(new QPushButton(this));
setFocusProxy(edit);
}
};
class PropertyDelegate : public QItemDelegate
{
public:
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
return new LineEditor(parent);
}
bool eventFilter(QObject *object, QEvent *event) {
if (event->type() == QEvent::KeyPress) {
qDebug() << "KeyPress";
}
if (event->type() …Run Code Online (Sandbox Code Playgroud) qitemdelegate ×10
qt ×10
c++ ×5
qlistview ×4
qtableview ×3
pyqt ×2
qlistwidget ×2
keypress ×1
pyside ×1
python ×1
qcombobox ×1
qevent ×1
qt4 ×1