我有一个QListWidget,我想用自定义小部件添加一堆项目:
listWidget = QListWidget()
item = QListWidgetItem()
item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
item.setCheckState(Qt.Unchecked)
listWidget.addItem(item)
widget = MyLabelAndPushButton()
item.setSizeHint(widget.sizeHint())
listWidget.setItemWidget(item, widget)
Run Code Online (Sandbox Code Playgroud)
顾名思义,MyLabelAndPushButton只是一个在布局中包含QLabel和QPushButton的小部件.问题是我无法使用窗口小部件旁边的listwidget中显示的复选框.它看起来完全正常,但是当我点击它时没有任何反应.如果我用setItemWidget删除该行,它可以正常工作.我究竟做错了什么?
编辑:
在bugreports.qt.io/browse/QTBUG-16386上报告了错误,但得到了答复"API不是为你打算做的而设计的"和"如果你想显示自定义小部件,请使用QListView和子类QItemDelegate." 显然它不是一个bug,只是API无法处理的东西.
QListWidgetItem包含2个数据:图标和文本.我想在其中存储另一个QString.我能怎么做?这是我的测试代码.在调用addItem之后,ListWidget不显示任何内容.
我怎么知道点击了哪个项目?SLOT函数是"void on_listWidget_itemClicked(QListWidgetItem*item)".显然,参数项是父类:QListWidgetItem,而不是子类:ListWidgetItem
ListWidgetItem::ListWidgetItem(const QIcon &icon, const QString &text,QString &ip, QListWidget *parent, int type)
{
myip = ip;
QListWidgetItem::QListWidgetItem(icon,text,parent,type);
}
ListWidgetItem::~ListWidgetItem()
{
}
QVariant ListWidgetItem::data(int role) const
{
if (role==IPROLE)
{
return myip;
}
return QListWidgetItem::data(role);
}
void ListWidgetItem::setData(int role, const QVariant &value)
{
if (role==IPROLE)
{
myip = value.toString();
}
QListWidgetItem::setData(role,value);
}
Run Code Online (Sandbox Code Playgroud) 我想为我的QListWidget对象添加双击属性.
我的命令行不起作用:
self.connect(self.listWidget, QtCore.SIGNAL("itemDoubleClicked(QtGui.QListWidgetItem)"), self.showItem)
Run Code Online (Sandbox Code Playgroud)
如何添加双击属性?如何将对象参数提供给QtCore.SIGNAL.
我正在使用QListWidget
并启用了多个选择:
mReferenceList->setSelectionMode(QAbstractItemView::MultiSelection);
Run Code Online (Sandbox Code Playgroud)
问题是,此模式的行为与Windows上的标准不符.通常,具有多个选项的列表框的工作方式是您单击项目,单击另一个,并且取消选择前一个项目.仅当您使用SHIFT+ LButton或CTRL+时LButton才会选择多个项目.
目前,当我点击几个项目时,列表框现在会选择一个项目.是否有一些设置可以实现这个beahviour?
我正在使用Qt 5.2和MingW.
这与Qt:QListWidget项之间的分隔线有关吗? 但是这个上面的答案在每个项目之后添加了分隔线,我想知道在特定项目之后添加分隔线的方法.
我有一个QListWidget
由自定义小部件使用setItemWidget
.
这些自定义列表项是完全静态的,它们只有一堆带有各种文本和图像的标签。我的 QListWidget 显示正确。我允许拖放重新排序,当我将项目移动到不同位置后,它就会变得不可见。它不会消失,因为它占用了显示屏的空间,我什至可以点击它,它只是完全不可见,就好像它里面的所有标签突然变成了空白。有趣的是,如果我为这些小部件设置背景颜色,自定义背景颜色不会被清除,只会清除内容。
如果我将泛型插入QListWidgetItem
到 中QListQidget
,即使在移动后它们仍然可见。
是什么导致自定义小部件变为空白,如何阻止这种情况发生?
例子。
QListWidgetItem *item;
MyCustomWidget *custom;
item = new QListWidgetItem();
item->setText("This will remain visible");
listWidget->addItem(item);
item = new QListWidgetItem();
custom = new MyCustomWidget ();
custom->setName(QString("This will vanish")); // this will add text to one of the labels inside it.
listWidget->addItem(item);
item->setSizeHint(QSize(50,65));
listWidget->setItemWidget(item, custom);
Run Code Online (Sandbox Code Playgroud)
用鼠标移动项目后,通过“普通”QListWidgetItems 添加的项目保留其内容,而通过“普通”QListWidgetItems 添加的项目setItemWidget
其内容消失。
编辑
即使我的自定义小部件只是一个QLabel
,其内容在移动后也会消失。
QLabel *label;
item = new QListWidgetItem();
label = new QLabel();
label->setText("This label will vanish"); …
Run Code Online (Sandbox Code Playgroud) 可以选择单个项目/行,但我想设置多个项目(窗口小部件配置为允许).可能吗?
我正在使用QT 5.2并且有一个QListWidget女巫显示一个字符串列表,我希望第一个项目(在0)初始设置为突出显示.我尝试了以下方法:
mUi->listWidget->setCurrentRow(0);
mUi->listWidget->setCurrentItem(mUi->listWidget->item(0),QItemSelectionModel::Select);
mUi->listWidget->currentItem()->setSelected(true);
mUi->listWidget->selectionModel()->select(mUi->listWidget->model()->index(0,0, QModelIndex()),QItemSelectionModel::Select);
Run Code Online (Sandbox Code Playgroud)
即使选择了项目,它也不会突出显示.如果我使用鼠标(单击)或键盘(Tab键)导航到该项目,它会突出显示但我希望它最初不使用鼠标或键盘突出显示.怎么做?提前致谢.
在学习 PyQt5 时,我在 ListWidget 小部件(和所有其他小部件)中发现了一个小问题(可能是一个错误)
在ListWidget
有一个addItem
重载的方法:(代码是在C ++中,但是这是在PyQt的相同的接口)
void addItem(const QString &label)
void addItem(QListWidgetItem *item)
void addItems(const QStringList &labels)
Run Code Online (Sandbox Code Playgroud)
所以问题是在 PyQt5 中没有更多QStringList
类型,我应该使用一个简单的字符串列表而不是QStringList
但是当我收到错误消息时,告诉我没有任何方法与给定的参数匹配:
Traceback (most recent call last):
File "main.py", line 21, in <module>
listWidget.addItem(ls)
TypeError: arguments did not match any overloaded call:
addItem(self, QListWidgetItem): argument 1 has unexpected type 'list'
addItem(self, str): argument 1 has unexpected type 'list'
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtWidgets import *
import sys
if __name__ …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个 QGIS 插件,其中的 UI 是用 PyQt 制作的。我有一个 QListWidget 和一个填充它的函数。我想为每个项目添加一个上下文菜单,只有一个选项:打开另一个窗口。
我在搜索信息时遇到了麻烦,因为大部分信息仅适用于 PyQt4 而我使用的是版本 5。我想在其上添加上下文菜单的 QListWidget 是ds_list_widget
. 这是一些相关的代码。
FORM_CLASS, _ = uic.loadUiType(os.path.join(
os.path.dirname(__file__), 'dialog_base.ui'))
class Dialog(QDialog, FORM_CLASS):
def __init__(self, parent=None):
...
self.p_list_widget = self.findChild(QListWidget, 'projects_listWidget')
self.p_list_widget.itemClicked.connect(self.project_clicked)
self.ds_list_widget = self.findChild(QListWidget, 'datasets_listWidget')
self.ds_list_widget.itemClicked.connect(self.dataset_clicked)
...
def project_clicked(self, item):
self.fill_datasets_list(str(item.data(Qt.UserRole)))
self.settings.setValue('projectIdValue', str(item.data(Qt.UserRole)))
def fill_datasets_list(self, project_id):
self.ds_list_widget.clear()
dataset_list = self.anotherClass.fetch_dataset_list(project_id)
for dataset in dataset_list:
#Query stuff from remote
...
item = QListWidgetItem(ds_name, self.ds_list_widget)
item.setIcon(self.newIcon(ds_img))
item.setData(Qt.UserRole, ds_id)
self.ds_list_widget.addItem(item)
self.ds_list_widget.setIconSize(self.iconSize)
Run Code Online (Sandbox Code Playgroud) qlistwidget ×10
qt ×7
python ×4
c++ ×3
pyqt ×3
pyqt5 ×2
contextmenu ×1
highlight ×1
multi-select ×1
pyqt4 ×1
qtgui ×1