如何隐藏QComboBox项而不是清除它们

时间:2014-08-07 00:03:22

标签: python pyqt

我无法找到隐藏QComboBox项目的方法。到目前为止,过滤其项目的唯一方法是删除现有项目(使用.clear()方法)。然后使用其QComboBox方法再次重建整个.addItem()

我宁愿暂时隐藏这些物品。当需要他们取消隐藏他们。 是否可以完成QCombobox上的隐藏/取消隐藏?

7 个答案:

答案 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_()