最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解QListWidget如何實現(xiàn)自定義Item效果

 更新時間:2022年04月12日 10:54:48   作者:中國好公民st  
這篇文章主要為大家介紹了如何通過QListWidget實現(xiàn)自定義Item效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下

首先,我們來看以下實現(xiàn)的最終效果吧!

我覺得這并不是一個很難得問題,最近新招了一個應屆生,發(fā)現(xiàn)在實現(xiàn)上述效果時,被困擾住了,是不是剛剛接觸Qt的這種稍微有難度的界面時,都會有些無頭緒呢?

所以,我打算分享給大家實現(xiàn)的思路,以及會出現(xiàn)的問題,就我一個開發(fā)5年C++的員工而言,針對新手會遇到哪些不懂的問題。

當前的開發(fā)環(huán)境:win10 VS2017 + Qt5.14.2 x64

在實現(xiàn)過程中新手會出現(xiàn)的難點,如下

1:如何在QListWidget中添加帶有按鈕、文本等其它控件的一條數(shù)據(jù)?

2:選中每一條之后如何響應?QListWidget自帶的item響應為什么不生效?

3:如何選中刪除按鈕并通知QListWidget做出具體的響應?

就根據(jù)上述三個問題,邊講述問題邊實現(xiàn)帶有自定義控件的Item內(nèi)容吧!

在使用QListWidget插入一條數(shù)據(jù)時,默認的方式,如下:

ui.listWidget->insertItem(0, "Text Content"); //方法1
ui.listWidget->addItem("Text Content"); //方法2

使用上述代碼是無法實現(xiàn)的,因為參數(shù)中只能添加QString類型的字符串,那么該如何實現(xiàn)添加自定義項呢?

在QListWidget類中提供了叫做QListWidgetItem的子類,用于實現(xiàn)自定義的item。

這時,我們就需要重新定義一個類,并且將該類與ListWidgetItem進行綁定,就可以實現(xiàn)每一行的item上展示屬于我們自定義的格式了。

例子中展示的item中顯示了一個選擇框、文件名稱以及刪除按鈕。

在這里,采用了QCheckBox以及QPushButton兩個按鈕實現(xiàn)的。

有人會詢問:文件名稱不應該使用QLabel控件表示嗎?

回答是:當前可以使用QLabel控件顯示文件名稱,這里采用QCheck主要是想要展示文件的圖標,根據(jù)不同的文件名后綴顯示不同的圖標。

自定義Widget

該類繼承自QWidget。假設(shè)叫做:CustomItem

有些新手會直接創(chuàng)建一個純的C++類,這樣做肯定是有問題的,當我們在外部使用當前自定義類時,你會發(fā)現(xiàn),為什么新創(chuàng)建的類會單獨分出來呢?

如果直接使用純C++類,還有另一個至關(guān)重要的問題,當前類需要進行消息交互時,你該如何傳遞給外部調(diào)用者呢?回調(diào)嗎?是不是有點大材小用呢?

class CustomItem : public QWidget
{
	Q_OBJECT

public:
	CustomItem(QWidget *parent);
	~CustomItem();
private:
	QCheckBox* m_checkName; //文件名
	QCheckBox* m_checkSelect; //選擇
	QPushButton* m_btnDelete; //刪除

};

自定義類CustomItem中創(chuàng)建了三個控件變量,分別表示了:選擇框、文件名稱以及刪除按鈕。

就是文章開始顯示效果圖的三個控件了。

接下來,需要定義一個外部調(diào)用接口,插入一條有效數(shù)據(jù),假設(shè)接口名稱是:AddINewtemData

class CustomItem : public QWidget
{
	Q_OBJECT

public:
	CustomItem(QWidget *parent);
	~CustomItem();
public: //對外開放接口
	void AddINewtemData(int nRow, QString qsFileName); //添加一條新數(shù)據(jù)
private:
	int m_nRow;
	QCheckBox* m_checkName; //附件名
	QCheckBox* m_checkSelect; //選擇
	QPushButton* m_btnDelete; //刪除

};

AddINewtemData 參數(shù)

參數(shù)1:代表的是當前自定義widget屬于QListWidget的行編號,用于后續(xù)消息傳遞使用。

參數(shù)2:需要展示的文件名稱

根據(jù)用戶傳入的文件名稱,根據(jù)文件后綴展示不同的圖標。

void CustomItem::AddINewtemData(int nRow, QString qPath)
{
	m_nRow = nRow; //記錄當前自定義widget對應的QListWidget的行號
        
	//根據(jù)路徑名,獲取文件名稱,并設(shè)置
	QFileInfo info(qPath);
	QString qsFileName = info.fileName();
	m_checkName->setText(qsFileName);
	//獲取文件后綴
	QString qsCheckStyle = "";
	if (info.suffix() == "mp4") //視頻文件
	{
            //自定義QCheckBox風格
	}
	else if (info.suffix() == "png") //圖片文件
	{
            //自定義QCheckBox風格
	}
	else if (info.suffix() == "xlsx") //表格文件
	{
            //自定義QCheckBox風格
	}
	else if (info.suffix() == "pdf")
	{
            //自定義QCheckBox風格
	}
	else //文檔文件
	{
            //自定義QCheckBox風格
	}
	m_checkName->setStyleSheet(qsCheckStyle);
}

構(gòu)造完自定義widget類之后,接下來就需要將該類與QListWidgetItem進行綁定,顯示到QListWidget上去。

外部調(diào)用方法,如下:

int nCount = ui.listWidget->count();

CustomItem* widget = new CustomItem(this);
widget->AddINewtemData(nCount, qsFileName);
widget->show();

QListWidgetItem* item = new QListWidgetItem;
item->setSizeHint(QSize(48, 48));
ui.listWidget->addItem(item);
ui.listWidget->setItemWidget(item, widget);

自定義CustomItem響應

上述功能可以實現(xiàn)QListWidget中展示自定義的widget之后,該如何點擊QListWidget中的每一條做出不同的響應呢?

此時,我們對每一行的QListWigetItem綁定自定義類之后,是無法響應QListWidget自身的選擇消息的!這一點需要大家記清楚了。

那么,該怎么觸發(fā)呢?

針對于每一個QWidget類,只要是繼承自QWidget,都會有鼠標的四大響應:

virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);

當鼠標在自定義類做了點擊效果后,肯定可以在鼠標按下事件中獲取點擊響應的。

所以,在自定義類CustomItem中需要重寫QWidget的系統(tǒng)消息:mousePressEvent

void CustomItem::mousePressEvent(QMouseEvent *event)
{
    QWidget::mousePressEvent(event);
}

斷點設(shè)在該響應函數(shù)中時,肯定是會觸發(fā)的,如果不可以肯定是當前widget處于禁用狀態(tài),或者是被遮蓋住了。

這里還有一個隱藏問題:有些同學在點擊自定義窗口時會發(fā)現(xiàn)這樣一個奇怪的現(xiàn)象,為什么點擊有些區(qū)域是響應mousePressEvent消息的,而點擊有些區(qū)域是不響應呢?

以下是重中之重了??!

這就是前一段話提到的內(nèi)容了,當前widget不觸發(fā)時,肯定是禁用或者是被遮擋住了。

在我們這個自定義Widget中有三個活躍的控件,兩個QCheck,一個QPushButton,當我們的鼠標在任意控件上點擊時,此時的點擊響應應該是響應到子控件上,而不是自定義的Widget(CustomItem)上。

為了讓鼠標點擊任何控件時,所有的響應都響應到父類Widget,也就是CustomItem上時,我們應該對支持鼠標響應操作的控件做特殊處理

setAttribute(Qt::WA_TransparentForMouseEvents)

每個控件都要設(shè)置以上的操作,當前控件只是用來顯示,不做任何消息處理,是當前窗口做的消息處理

自定義Widget控件響應并通知外界處理

下面,來說一說第三個重點問題,如何通知外界處理。

我們使用了自定義的Widget之后就不能再使用QListWidget的內(nèi)部選中消息了,為了讓外部窗口獲取內(nèi)部Widget的消息時,此時我們需要采用發(fā)信號的方式,通知外界,模擬QListWidget消息。

signals:
    void Msg_SendDeleteItemData

外部窗口直接操作該消息,使用方法跟普通的方法一致,這里就不再過多介紹Qt中消息機制了。

以上實現(xiàn)QListWidget內(nèi)嵌自定義窗口的核心功能就說清楚了。

到此這篇關(guān)于詳解QListWidget如何實現(xiàn)自定義Item效果的文章就介紹到這了,更多相關(guān)QListWidget自定義Item內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于C語言string函數(shù)的詳解

    基于C語言string函數(shù)的詳解

    本篇文章是對C語言中string函數(shù)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ Log日志類輕量級支持格式化輸出變量實現(xiàn)代碼

    C++ Log日志類輕量級支持格式化輸出變量實現(xiàn)代碼

    這篇文章主要介紹了C++ Log日志類輕量級支持格式化輸出變量實現(xiàn)代碼,需要的朋友可以參考下
    2019-04-04
  • C語言實現(xiàn)最小生成樹構(gòu)造算法

    C語言實現(xiàn)最小生成樹構(gòu)造算法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)最小生成樹構(gòu)造算法,利用Prim算法或kruskal算法求解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 使用C++調(diào)用Python代碼的方法詳解

    使用C++調(diào)用Python代碼的方法詳解

    這篇文章主要介紹了使用C++調(diào)用Python代碼并給大家介紹了.py和.pyc的區(qū)別,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 詳解Qt中QStackedWidget控件的使用

    詳解Qt中QStackedWidget控件的使用

    這篇文章主要為大家詳細介紹了Qt中QStackedWidget控件的具體使用,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-02-02
  • 一文帶你初識C++和命名空間

    一文帶你初識C++和命名空間

    C++是在C語言基礎(chǔ)上發(fā)展的面向?qū)ο笳Z言,C++支持過程化、面向?qū)ο蠹俺橄髷?shù)據(jù)類型的程序設(shè)計,C++的發(fā)展包括多個版本,下面這篇文章主要介紹了一文帶你初識C++和命名空間的相關(guān)資料,需要的朋友可以參考下
    2024-10-10
  • Qt禁止程序多開的實現(xiàn)示例

    Qt禁止程序多開的實現(xiàn)示例

    本文主要介紹了Qt 禁止程序多開的實現(xiàn)示例,主要介紹了三種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • 初學C++之自定義類型名簡化詳解

    初學C++之自定義類型名簡化詳解

    下面小編就為就大家?guī)硪黄鯇WC++之自定義類型名簡化詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • 使用c++實現(xiàn)OpenCV圖像橫向&縱向拼接

    使用c++實現(xiàn)OpenCV圖像橫向&縱向拼接

    這篇文章主要介紹了使用c++實現(xiàn)OpenCV圖像橫向&縱向拼接,文中有圖像拼接函數(shù),可以實現(xiàn)如“長圖拼接王”這類小程序的類似功能,大家可以將該函數(shù)封裝在軟件中自由使用
    2021-08-08
  • 一文詳細講解C++精妙的哈希算法

    一文詳細講解C++精妙的哈希算法

    這篇文章主要介紹了C++精妙的哈希算法的相關(guān)資料,哈希結(jié)構(gòu)通過哈希函數(shù)將關(guān)鍵碼映射到表中的特定位置,以提高搜索效率,理想的哈希函數(shù)應保證一致性、哈希值均勻分布、高計算效率與最小化沖突,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-10-10

最新評論

九龙县| 任丘市| 蒙城县| 桦川县| 辰溪县| 同仁县| 齐齐哈尔市| 云浮市| 建昌县| 马山县| 大关县| 舒城县| 定陶县| 玛沁县| 江城| 西贡区| 万安县| 永修县| 陈巴尔虎旗| 璧山县| 贵南县| 阳信县| 郑州市| 阳东县| 锦屏县| 察雅县| 荃湾区| 施甸县| 花垣县| 海丰县| 阆中市| 新兴县| 福鼎市| 汉沽区| 日土县| 宁都县| 香港| 会同县| 阿鲁科尔沁旗| 瑞安市| 翁牛特旗|