目錄
一、概述
二、功能需求
三、提升操作
1)拖入標準控件
2)自定義類
?3)提升控件
一、概述
? ? ? ?QT中提供的標準控件能夠滿足我們大多數情況下的功能需求,但是在一些特殊應用場合,我們可能需要對控件的功能進行擴展,或者改寫控件的功能實現。為滿足此需求,QT提供了對標準控件的提升功能,用于重新自定義標準控件的實現。本文以QListWidget控件為例,詳細介紹了控件提升的具體操作和實現。
二、功能需求
? ? ? ?我們需要實現在QListWidget控件中選中項,然后再對選中項進行拖動操作。如果使用QListWidget控件的默認功能,發現在拖動選中項時,鼠標按下后,鼠標所在位置本已被選中的項將被取消選中,導致該項不能被同時拖動。分析原因是,QListWidget控件在標記選中項的操作是在鼠標左鍵按下時執行的,即當鼠標左鍵按下事件發生時,QListWidget控件中項目的選中狀態就會立即切換。因此,要實現對所有選中項的拖動,需要改寫QListWidget控件的鼠標單擊事件函數。而我們不可能去改寫QT提供的標準控件的實現代碼,所以,此處可以采用控件提升的方式,用我們自定義的類來提升標準控件,從而實現改寫標準控件功能的目的。
三、提升操作
1)拖入標準控件
? ? ? ?首先我們可以新建一個QWidget項目,在QWidget控件中拖入QListWidget控件,如下圖所示。
2)自定義類
? ? ? ?在項目工程目錄中添加一個C++類,包.h文件和.cpp文件。類的名稱可以自己定義。頭文件的代碼實現如下。該類繼承自QListWidget,注意此處繼承的類必須與被提升的類相同。類中定義了一個私有成員變量,用于記錄點擊的項item。然后申明了構造函數和需要重寫的兩個虛函數,鼠標按下事件和鼠標移動事件。
#ifndef SLISTWIDGET_H
#define SLISTWIDGET_H#include <QObject>
#include <QWidget>
#include <QListWidget>
#include <QMouseEvent>
#include <QDragMoveEvent>class SListWidget: public QListWidget
{Q_OBJECT
private:QListWidgetItem *clickeditem;//記錄下點擊的Item
public:explicit SListWidget(QWidget *parent = nullptr);virtual void mousePressEvent(QMouseEvent *e)override;virtual void mouseMoveEvent(QMouseEvent *e)override;
};#endif // SLISTWIDGET_H
? ? ? ? 函數的代碼實現如下。在mousePressEvent函數實現中,當鼠標按下時,首先執行QListWidget控件的默認鼠標按下事件函數,然后將此時點擊的項記錄下來,獲取它的指針。如果指針為空,則清除所有已選擇的項。該功能可以實現在單擊控件的空白處時,取消所有選擇的功能。
? ? ? ? 在mouseMoveEvent函數實現中,當鼠標移動時,首先判斷當前鼠標按下的是左鍵,然后判斷記錄的項不為空,再后就是切換記錄項的選擇狀態。此處邏輯可以實現在按下左鍵的同時移動鼠標時,之前選中的項保持選中,之前未被選中的項依然不被選中。如此設計是因為在按下左鍵拖動鼠標時,按下左鍵會改變項的選中狀態。隨后將記錄的項置空,確保上述判斷邏輯只執行一次,因為在鼠標移動過程中,mouseMoveEvent函數會被持續重復調用。最后任然執行QListWidget控件的默認mouseMoveEvent函數,確保拖動功能的正常執行。
#include "slistwidget.h"SListWidget::SListWidget(QWidget *parent) : QListWidget(parent)
{}void SListWidget::mousePressEvent(QMouseEvent *e)
{QListWidget::mousePressEvent(e);// 獲取當前鼠標位置對應的項clickeditem = itemAt(e->pos());//記錄下被選擇的項if (clickeditem) {}elseclearSelection();
}void SListWidget::mouseMoveEvent(QMouseEvent *e)
{if (e->buttons() & Qt::LeftButton) {if(clickeditem){if(!clickeditem->isSelected())clickeditem->setSelected(true);elseclickeditem->setSelected(false);clickeditem = nullptr;}}QListWidget::mouseMoveEvent(e);
}
?3)提升控件
? ? ? ? 回到QT Creator的窗體設計界面,選中需要提升的QListWodget控件,單擊鼠標右鍵選擇“提升為...”選項,彈出如下窗口。按圖中所示步驟,依次輸入自定義的類名,點擊添加按鈕,然后選中添加的類,最后點擊提升。如此便完成了對QListWidget控件的提升操作。