在QT中進行控件提升操作

目錄

一、概述

二、功能需求

三、提升操作

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控件的提升操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74135.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74135.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74135.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何自定義知行之橋Webhook端口返回的Response消息

一、Webhook端口功能概述 知行之橋的Webhook端口提供靈活的消息響應機制&#xff0c;支持用戶通過修改配置文件自定義返回的消息體內容&#xff0c;能夠查看是否調用接口成功、數據是否推送成功以及自定義返回給用戶端的響應內容。 本指南將詳解如何通過腳本配置實現以下需求…

pnpm config set ignore-workspace-root-check true

異常 ERR_PNPM_ADDING_TO_ROOT? Running this command will add the dependency to the workspace root, which might not be what you want - if you really meant it, make it explicit by running this command again with the -w flag (or --workspace-root). If you don…

【iOS】SwiftUI 路由管理(NavigationStack)

QDRouter.swift import SwiftUIMainActor class QDRouter: ObservableObject {Published var path NavigationPath()static let main QDRouter() // 單例private init() {}func open(_ url: String) {guard let url URL(string: url) else {return}UIApplication.shared.op…

藍橋杯學習-13回溯

13回溯 一、回溯1 例題1–遞歸實現排列型枚舉-藍橋19684 1.遞歸可以解決不定次數的循環問題 2.使用數組來標記數字是否被選過import java.util.Scanner;public class Main {static int n;static boolean[] st new boolean[10]; //判斷數字是否被選過static int[] path ne…

【IDEA中配置Maven國內鏡像源】

1. 為什么需要配置國內鏡像源&#xff1f; 首先&#xff0c;Maven本身的工作原理是通過從倉庫中下載依賴包。而這些依賴通常來自于 Maven中央倉庫&#xff08;位于國外&#xff09;&#xff0c;由于網絡原因&#xff0c;我們在國內訪問這些遠程倉庫的速度比較慢&#xff0c;甚至…

【QA】觀察者模式在QT有哪些應用?

1. 信號與槽機制 Qt的**信號與槽&#xff08;Signals & Slots&#xff09;**是觀察者模式的典型實現&#xff0c;通過元對象系統&#xff08;Meta-Object System&#xff09;實現松耦合通信。 核心特點&#xff1a; 類型安全&#xff1a;編譯時檢查參數匹配跨線程支持&…

uniapp中的路由、本地存儲與網絡請求

navigator 在UniApp中&#xff0c;navigator 組件用于頁面跳轉和應用內導航。 基本使用 屬性&#xff1a; url: 需要跳轉的目標頁面路徑&#xff0c;路徑可以是相對路徑或絕對路徑。open-type: 跳轉的方式&#xff0c;默認為 navigateTo。其他可選值包括&#xff1a;redirec…

python3使用lxml解析xml時踩坑記錄

文章目錄 你的 XML 數據解析 XML----------------------------1. 獲取 mlt 根元素的屬性--------------------------------------------------------2. 獲取 chain 元素的屬性--------------------------------------------------------3. 獲取所有 property 的值-------------…

【DeepSeek 學c++】dynamic_cast 原理

用于向下轉化。 父類引用指向指類對象 假設父親是a, 子類是b. B* pb new B; 子類對象 A* pa 父類引用指向子類對象&#xff0c; 那么向上轉化 Apa pb 這個是自動完成的&#xff0c;隱式轉化&#xff0c;不需要dynamic_cast 向下轉化指的是 A pa new B。 這個是指向子類對象…

c++ 數組索引越界檢查

用 c 編寫了一些程序&#xff0c;發現 c 不會自動檢查數組的索引越界問題。有時候程序運行錯誤&#xff0c;提示的錯誤信息莫名其妙&#xff0c;但很可能是某個數組越界的問題。 例如&#xff1a; #include <iostream>int main() {double arr[5] {1.1, 2.2, 3.3, 4.4,…

Touch Diver:Weart為XR和機器人遙操作專屬設計的觸覺反饋動捕手套

在虛擬現實&#xff08;VR&#xff09;和擴展現實&#xff08;XR&#xff09;領域&#xff0c;觸覺反饋技術正逐漸成為提升沉浸感和交互體驗的重要因素。Weart作為這一領域的創新者&#xff0c;憑借其TouchDIVER Pro和TouchDIVER G1觸覺手套&#xff0c;為用戶帶來了高度逼真的…

基于deepseek的智能語音客服【第二講】后端異步接口調用封裝

本篇內容主要講前端請求&#xff08;不包含&#xff09;訪問后端服務接口&#xff0c;接口通過檢索知識庫&#xff0c;封裝提示詞&#xff0c;調用deepseek的&#xff0c;并返回給前端的全過程&#xff0c;非完整代碼&#xff0c;不可直接運行。 1.基于servlet封裝異步請求 為…

歸并排序的思路與實現

歸并排序主要是兩大模塊 分治 和 合并 即將已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每個子序列有序&#xff0c;再使子序列段間有序。若將兩個有序表合并成一個有序表&#xff0c;稱為二路歸并 由于使用了新的數組 那么空間復雜度就為O(n) 但這…

Word中公式自動標號帶章節編號

&#xff08;1&#xff09;插入一行三列的表格&#xff0c;設置寬度分別為0.5&#xff0c;13.39和1.5&#xff0c;設置縱向居中&#xff0c;中間列居中對齊&#xff0c;最右側列靠右對齊&#xff0c;設置段落如下 &#xff08;2&#xff09;插入域代碼 【Word】利用域代碼快速實…

阿里云服務器環境部署 四 MySQL主從配置

安裝MySQL 導入mysql鏡像 docker load -i /opt/dockerinstall/mysql/mysql-8.1.0.tar docker run --privilegedtrue --name mysql8 --restartunless-stopped -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -v /usr/local/mysql/logs:/var/log/mysql -v /usr/local/mysql/d…

[RH342]iscsi配置與排錯

[RH342]iscsi配置與排錯 1. 服務端配置1.1 安裝targetcli1.2 準備磁盤1.3 服務端配置1.4 防火墻配置 2. 客戶端配置2.1 安裝客戶端軟件2.2 配置客戶端2.3 連接登錄服務端2.4 掛載使用 3. 安全驗證擴展3.1 服務端3.2 客戶端 4. 常見的排錯點4.1 服務端常見錯誤4.2 客戶端常見錯誤…

服裝零售行業數字化時代的業務與IT轉型規劃P111(111頁PPT)(文末有下載方式)

服裝零售行業數字化時代的業務與IT轉型規劃P111 詳細資料請看本解讀文章的最后內容。 隨著數字化技術的迅猛發展&#xff0c;服裝零售行業正經歷著前所未有的變革。本文將對《服裝零售行業數字化時代的業務與IT轉型規劃P111》進行詳細解讀&#xff0c;探討未來幾年內該行業的…

基于javaweb的SSM+Maven寵物領養寵物商城流浪動物管理系統與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

PostgreSQL 數據庫中導入大量數據

在 PostgreSQL 數據庫中導入大量數據,可根據數據來源和格式選擇不同的方法。以下為你詳細介紹幾種常見的方式: 1. 使用 COPY 命令(適用于本地數據文件) COPY 命令是 PostgreSQL 內置的高效數據導入工具,適合處理本地的數據文件。 步驟 準備數據文件 確保你的數據文件格…

C++語法之命名空間二

A.h頭文件中代碼&#xff1a; namespace a {void 輸出(); }; A.cpp源文件中代碼&#xff1a; #include <iostream> #include "A.h" void a::輸出() {std::cout << "A.h里的輸出函數" << std::endl; } B.h頭文件中代碼&#xff1a; …