我无法找到隐藏QComboBox
项目的方法。到目前为止,过滤其项目的唯一方法是删除现有项目(使用.clear()
方法)。然后使用其QComboBox
方法再次重建整个.addItem()
。
我宁愿暂时隐藏这些物品。当需要他们取消隐藏他们。 是否可以完成QCombobox上的隐藏/取消隐藏?
答案 0 :(得分:2)
以@kef的回答为基础
(请在python问题上使用C ++)
默认情况下,QComboBox将对视图使用QListView,因此您可以执行以下操作:
android.widget.RelativeLayout cannot be cast to android.widget.FrameLayout
上述内容的一个缺点是,即使该项目将从弹出窗口中隐藏,用户仍然可以使用鼠标滚轮选择它。为了克服这个问题,请在隐藏行中添加以下内容:
QListView* view = qobject_cast<QListView *>(combo->view());
Q_ASSERT(view != nullptr);
view->setRowHidden(row, true);
使用上面的行将被隐藏,并且用户将无法使用鼠标滚轮滚动到该行。
要取消隐藏,只需执行相反的操作即可:
QStandardItemModel* model = qobject_cast<QStandardItemModel*>(combo->model());
Q_ASSERT(model != nullptr);
QStandardItem* item = model->item(row);
item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
答案 1 :(得分:1)
使用setVisible()
更改对象的可见性:
.setVisible(False) # Not Visible
.setVisible(True) # Visible
答案 2 :(得分:1)
您可以使用removeItem()
方法从QComboBox
中删除项目。
void QComboBox :: removeItem(int index)
从组合框中删除给定索引处的项目。如果删除索引,这将更新当前索引。
如果索引超出范围,此函数不执行任何操作。
如果您不知道索引,请使用findText()
方法。
QComboBox
项没有隐藏/取消隐藏方法。
答案 3 :(得分:1)
虽然没有直接隐藏QComboBox
项目的方法,但您可以使用QComboBox::setItemData
并将大小设置为(0,0)以隐藏QComboBox
的项目:
comboBox->setItemData(row, QSize(0,0), Qt::SizeHintRole);
答案 4 :(得分:1)
如果有人仍在寻找答案:
默认情况下,QComboBox
使用QListView
显示弹出式列表,QListView
使用setRowHidden()
方法:
comboBox->view()->setRowHidden(3, true)
答案 5 :(得分:0)
再次显示该项目:
comboBox->setItemData(row, QVariant(), Qt::SizeHintRole);
注意:更改SizeHintRole在OS X上不起作用。
答案 6 :(得分:0)
我对缺乏隐藏功能(使项目保持索引等)感到沮丧后遇到了这个线程。 我根据@Kef和@CJCombrink的答案来工作。基本上这只是一个python翻译。
我对qobject_cast有问题。 通过将.setView(QListView())设置为QComboBox来解决该问题。
combo=QComboBox()
combo.setView(QListView())
隐藏:
combo.view().setRowHidden(rowindex,True)
tmp_item=combo.model().item(rowindex)
tmp_item.setFlags(tmp_item.flags() & ~Qt.ItemIsEnabled)
取消隐藏:
combo.view().setRowHidden(rowindex,False)
tmp_item=combo.model().item(rowindex)
tmp_item.setFlags(tmp_item.flags() | Qt.ItemIsEnabled)
我决定对QComboBox进行子类化,并添加hide功能。波纹管是用于测试的使用示例。 欢迎您使用它。我没有保证。
import sys
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
#subclassed QComboBox with added hide row functionality
class ComboBox_whide(QComboBox):
def __init__(self):
super().__init__()
self.setView(QListView())#default self.view() is a QAbstractItemView object which is missing setRowHidden, therefore a QListView needs to be set
def hide_row_set(self,row,value=True):
"""sets the row accesibility
value=True hides the row"""
self.view().setRowHidden(row,value)#hides the item from dropdown, however the item is stil accesible by moving down with arrow keys or mouse wheel. The following disables solves that
tmp_item=self.model().item(row)
if value:#hide -> disable
tmp_item.setFlags(tmp_item.flags() & ~Qt.ItemIsEnabled)
else:#enable
tmp_item.setFlags(tmp_item.flags() | Qt.ItemIsEnabled)
def hide_row_toggle(self,row):
"""toggles the row accesibility"""
if self.view().isRowHidden(row):#is hidden, therefore make available
self.hide_row_set(row,False)
else:#is not hidden, therefore hide
self.hide_row_set(row,True)
class Main(QMainWindow):
def __init__(self):
super().__init__()
cwidg=QWidget()
clayer=QVBoxLayout()
cwidg.setLayout(clayer)
self.setCentralWidget(cwidg)
#button for testing
self.btn=QPushButton('Button')
self.btn.setCheckable(True)
clayer.addWidget(self.btn)
#subclassed QComboBox
self.combo=ComboBox_whide()
for n in range(3):#add 3 items with tooltips
self.combo.addItem('item%i'%n)
self.combo.setItemData(n,'tip%i'%n,Qt.ToolTipRole)
clayer.addWidget(self.combo)
#button test function - choose either or for testing
self.btn.clicked.connect(self.btn_clicked)
#uncomment for add/remove example self.btn.clicked.connect(self.remove_add_item)
def btn_clicked(self):
self.combo.hide_row_toggle(1)
def remove_add_item(self):# here for naive comparison and to show why removing and adding is not ok
if self.combo.count()==3:
self.combo.removeItem(1)
else:
self.combo.addItem('new')#new "item1" withouth the ToolTip
if __name__ == '__main__':
app = QApplication.instance()
if app is None:#Pyside2 ipython notebook check
app = QApplication(sys.argv)
main = Main()
main.show()
app.exec_()