簡體   English   中英

QListWidget中的setSelectionModel停止發出itemSelectionChanged信號

[英]setSelectionModel in QListWidget stops emission of itemSelectionChanged signal

在我的QListWidget子類中,當我使用setSelectionModel替換其QItemSelectionModel時,列表小部件停止發出其itemSelectionChanged信號。 在真實的代碼中,我這樣做是為了安裝QItemSelectionModel的子類,但是即使我僅使用新的QItemSelectionModel,也會出現問題。

MyListWidget::MyListWidget(QWidget* parent)
    : QListWidget(parent)
{
    QItemSelectionModel* oldSelectionModel = selectionModel();
    QItemSelectionModel* newSelectionModel = new QItemSelectionModel(model(), oldSelectionModel->parent());
    setSelectionModel(newSelectionModel);
    oldSelectionModel->deleteLater();
}

在調試器中,我可以看到QItemSelectionModel發出其selectionChanged信號,但QListWidget從未發出其相應的itemSelectionChanged信號。

如果我注釋掉此構造函數的主體,一切正常。 和以前一樣,我可以看到QItemSelectionModel發出其selectionChanged信號,但是現在觸發QListWidget發出itemSelectionChanged。

看來我對setSelectionModel的調用導致QItemSelectionModel :: selectionChanged和QListWidget :: itemSelectionChanged之間的連接斷開。

順便說一句,我檢查了是否將錯誤的參數傳遞給新的QItemSelectionModel。 創建完之后,newSelectionModel的model()和parent()與oldSelectionModel相同。 我也嘗試注釋掉deleteLater的調用,但這沒有幫助。

任何幫助,不勝感激。

根據QAbstractItemViewQt文檔, setSelectionModel替換當前的選擇模型,如果在此之后調用setModel() ,它將不起作用。

請注意,如果在此函數之后調用setModel(),則給定的selectionModel將替換為由視圖創建的選擇模型。

此外,根據QListWidget文檔,

QListWidget是一個便利類,提供與QListView提供的列表視圖類似的列表視圖,但具有用於添加和刪除項目的經典基於項目的界面。 QListWidget使用內部模型來管理列表中的每個QListWidgetItem。

看起來無論何時添加項目,該模型都會得到更新/刷新,從而使您的自定義選擇模型無效(這只是我的想法)。

另外,您無需按照Qt docs刪除舊的選擇模型

注意 :如果不再需要舊的選擇模型,則由應用程序決定是否刪除它。 也就是說,如果其他視圖沒有使用它。 當其父對象被刪除時,這將自動發生。 但是,如果它沒有父對象,或者該父對象是一個壽命很長的對象,則最好調用其deleteLater()函數以顯式刪除它。

如果您想要這種定制級別,則QListView可能是一個更好的選擇。

QListWidget

QAbstractItemView中


只是想知道,是否在將所有項目添加到列表小部件后嘗試設置自定義選擇模型?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM