AsWing中自定义拖拽功能(Drag And Drop)

关于QAbstractItemView的dragEnabled属性的疑惑 相反,我们需要使用它的子类,如QTableView、QTreeView、QListView等,并重写它们的dragMoveEvent()、dragEnterEvent()和dragLeaveEvent()等方法,才能实现拖拽操作。在dropEvent()方法中,我们获取了拖拽操作的数据,并将其插入到表格中指定的行中。在这个示例代码中,我们创建了一个自定义的MyTable类,继承自QTableView,并重写了dragEnterEvent()、dragMoveEvent()和dropEvent()方法。 阅读详情

本文原载于FlashSeer ,文章地址:http://www.flashseer.org/bbs/viewthread.php?tid=342&extra=page%3D1 。

下面是我最近用到AsWing的拖拽功能,之后的一些初级经验。

目录

1 快速开始
        1.1 被拖拽的组件
        1.2 拖拽目标组件

2 几个基本方法
        2.1 setDragEnabled
        2.2 setDropTrigger
        2.3 addDragAcceptableInitiator
        2.4 DragManager.startDrag

3 高级话题
        3.1 DraggingImage & addDragAcceptableInitiator
        3.2 DragListener
        3.3 getCurrentDropTargetDropTriggerComponent

1 快速开始
1.1 被拖拽的组件
        首先,要拖拽的组件应该setDragEnabled( true ),保证其能发出拖动识别ON_DRAG_RECOGNIZED事件。同时应该监听此组件的ON_DRAG_RECOGNIZED事件。

                   ...
                   //part 1 drag initiator
                   dragBtn = new JButton( "拖我到下边的Pane" );
                   dragBtn.setDragEnabled(true);
                   dragBtn.addEventListener(JButton.ON_DRAG_RECOGNIZED, __dragRecognized, this);
                           ...


            /**
            * 监听到dragBtn的ON_DRAG_RECOGNIZED事件,将拖拽事件托管给DragManager。
            * @param dragInitiator            此例中是指dragBtn。
            * @param touchedChild      被鼠标拖住的组件,此例中亦是dragBtn。
            */
           private function __dragRecognized( dragInitiator : Component, touchedChild : Component ) : Void{
                   DragManager.startDrag( dragBtn , new SourceData("dragData", JButton(dragInitiator).getText() ));
           }

1.2 拖拽目标组件
        其次,拖拽目标组件应该setDropTrigger( true ),保证其能接收以下4个事件。
             a. ON_DRAG_ENTER(当拖拽组件刚被拖到目标组件上时,触发此事件)、
             b. ON_DRAG_OVERRING(当拖拽组件已被拖到目标组件上,每次移动时触发此事件)、
             c. ON_DRAG_EXIT(与ON_DRAG_ENTER事件相反,当拖拽组件刚被拖出目标组件,触发此事件)、
             d. ON_DRAG_DROP(当拖拽组件已被拖到目标组件上,此次拖拽事件结束时触发此事件)

                   //part 2 drag target
                   pane = new JPanel(new FlowLayout());
                   pane.setDropTrigger( true );
                   pane.addDragAcceptableInitiator( dragBtn );
                   pane.addEventListener(JPanel.ON_DRAG_ENTER, __dragEnter, this);
                   pane.addEventListener(JPanel.ON_DRAG_OVERRING, __dragOverring, this);
                   pane.addEventListener(JPanel.ON_DRAG_EXIT, __dragExit, this);
                   pane.addEventListener(JPanel.ON_DRAG_DROP, __dragDrop, this);


           /**
            * 监听到dragBtn的ON_DRAG_DROP事件,一般为处理拖拽事件的关键点。
            */
           private function __dragDrop(source : Component, dragInitiator : Component, sourceData : SourceData, mousePos : Point) : Void{
                   __trace("ON_DRAG_DROP", source, dragInitiator, sourceData, mousePos);
                   pane.append(new JButton(sourceData.getData().toString()+(pane.getComponentCount()+1)));
           }

快速开始就OK啦,具体代码参见附件:[DragAndDropDemoV1源代码] :[DragAndDropDemoV2源代码]

 

2 几个基本方法
2.1 addDragAcceptableInitiator

setDragEnabled(b : Boolean)
         Sets whether this component can fire ON_DRAG_RECOGNIZED event.(此段注释为 AsWing 自带,下同)

         设置是否发出拖动识别(ON_DRAG_RECOGNIZED)事件。
         默认设为false。

2.2 setDropTrigger
setDropTrigger(b : Boolean)
         Sets whether this component can trigger dragging component to fire drag events when dragging over to this component.

         设置此组件是否能触发拖动组件发出拖动事件,当拖动组件被拖动到此组件上时(参见高级话题3.3)。

2.3 setDropTrigger
addDragAcceptableInitiator(com : Component)
         Adds a component to be the acceptable drag initiator to this component.It is not meanning that the DnD events will not be fired when the initiator is dragging enter/over/exit/drop on this component.It is meanning that you can have a convenient way to proccess that events from the method isDragAcceptableInitiator later, and the default dragging image will take advantage to present a better picture when painting.
         * @param com the acceptable drag initiator

         添加一个组件为当前组件可接受的拖动初始组件。但这不意味着当拖动初始组件被拖动到此组件上时,此组件不会发出拖拽事件。它意味着你可以用 isDragAcceptableInitiator 方法判断一个component是否为当前组件可接受的拖动初始组件,同时默认的拖动图像也可借此方法更合理的被描绘(参见高级话题3.1)。

2.4 DragManager.startDrag
DragManager.startDrag(dragInitiator : Component, sourceData : SourceData, dragImage : DraggingImage, dragListener : DragListener)
          Starts dragging a initiator, with dragSource, a dragging Image, and a listener. The drag action will be finished at next Mouse UP/Down Event(Mouse UP or Mouse Down, generally you start a drag when mouse down, then it will be finished when mouse up, if you start a drag when mouse up, it will be finished when mouse down).
          * @param dragInitiator the dragging initiator
          * @param sourceData the data source will pass to the listeners and target components
          * @param dragImage (optional)the image to drag, default is a rectangle image.
          * @param dragListener (optional)the listener added to just for this time dragging action, default is null(no listener)

         指定sourceData , dragImage(可选), dragListener(可选)3个参数开始拖动初始组件(dragInitiator)。这个拖动事件将在下一个鼠标的UP/Down时结束。
          * @param dragInitiator 拖动初始组件
          * @param sourceData 传给监听者和目标组件的数据。
          * @param dragImage (可选),拖动时显示的图片,默认是一个矩形框(参见高级话题3.1)。
          * @param dragListener (可选),为此次拖动事件添加监听者。默认为null(没有监听者)(参见高级话题3.2)。


3 高级话题
3.1 DraggingImage & addDragAcceptableInitiator
        3.1.1 自定义WindowsDragImage --Windows风格的拖动图像
        参照org.aswing.dnd.DefaultDragImage和org.aswing.dnd.ListDragImage,我们写一个自己的 DragImage。其效果如同拖动windows“资源管理器”里的图标一样。主要是实现interface DraggingImage的几个方法,较简单请看代码注释及下节3.1.2对DraggingImage的描述。

         3.1.2 interface DraggingImage

         setCanvas(target : MovieClip)
                 * Paints the image for normal state of dragging.
                 * 传入用来描绘拖动中的图像的MovieClip。        

         switchToAcceptImage()
                 * Paints the image for accept state of dragging.(means drop allowed)
                 * 表现拖动组件被目标组件接受时的图像。
        
         switchToRejectImage()
                 * Paints the image for reject state of dragging.(means drop not allowed)
                 * 表现拖动组件被目标组件不被接受时的图像。

         3.1.3 addDragAcceptableInitiator

         DragManager中onMouseMove方法。

         private static function onMouseMove():Void{
...
         if(dropC != enteredComponent){
                         if(enteredComponent != null){
//一般情况下,先将拖动图像switchToRejectImage()--参见DraggingImage的方法: switchToRejectImage()
                                 s_dragImage.switchToRejectImage();
                                 fireDragExitEvent(s_dragInitiator, s_sourceData, globalPos, enteredComponent);
                                 enteredComponent.fireDragExitEvent(s_dragInitiator, s_sourceData, globalPos);
                         }
                         if(dropC != null){
//*********
下边这句就是addDragAcceptableInitiator的关键所在,当鼠标移动时,DragManager会判断目标组件是否接受拖动组件, 如接受就使用拖动图像DraggingImage的switchToAcceptImage()描绘成可接受状态.同时如果我们没有使用 addDragAcceptableInitiator,DragManager将不会自动识别拖动组件是否为目标组件可接受,亦不会调用 DraggingImage的对应方法.
//*********
                                 if(dropC.isDragAcceptableInitiator(s_dragInitiator)){
//在目标组件接受拖动组件的情况下,将拖动图像switchToAcceptImage()--参见DraggingImage的方法: switchToAcceptImage()
                                         s_dragImage.switchToAcceptImage();                                  }
                                 fireDragEnterEvent(s_dragInitiator, s_sourceData, globalPos, dropC);
                                 dropC.fireDragEnterEvent(s_dragInitiator, s_sourceData, globalPos);
                         }
                         enteredComponent = dropC;
                 }
...
3.2 DragListener
观察DragManager中的几个fireDrag*****Event,有如下几行:

var lis:DragListener = DragListener(listeners[i]);
lis.onDragStart(dragInitiator, sourceData, pos);

var lis:DragListener = DragListener(listeners[i]);
lis.onDragEnter(dragInitiator, sourceData, pos, targetComponent);

var lis:DragListener = DragListener(listeners[i]);
lis.onDragOverring(dragInitiator, sourceData, pos, targetComponent);

var lis:DragListener = DragListener(listeners[i]);
lis.onDragExit(dragInitiator, sourceData, pos, targetComponent);

var lis:DragListener = DragListener(listeners[i]);
lis.onDragDrop(dragInitiator, sourceData, pos, targetComponent);
这几个onDrag***方法不就是DragListener所定义的那几个方法么?
那么在1.DragManager.startDrag()方法 及 2.DragManager.addDragListener()方法传入的 DragListener就可以监听到拖动组件的一举一动 啦。

3.3 getCurrentDropTargetDropTriggerComponent
研究它的用处在于我们可以更清楚地了解DragManager如何识别目标组件的。

public static function getCurrentDropTargetDropTriggerComponent():Component{
//*************
//这个(dragProxyMC)就是DraggingImage传入的target.用以描绘组件的拖动图像.
         return getDropTargetDropTriggerComponent(dragProxyMC);
}

public static function getDropTargetDropTriggerComponent(draggingMC:MovieClip):Component{
                 var c:Component = getDropTargetComponent(draggingMC);
//*************
//注意这个获取的c组件,如果它不为null且c.isDropTrigger()==false (说明此组件的setDropTrigger(false),参见第2.2节),那么就取其父//组件,此处while循环可以追溯c的祖先,直至找到一 个setDropTrigger(true)的组件.
                 while(c != null && !c.isDropTrigger()){
                         c = c.getParent();
                 }
                 return c;
}

public static function getDropTargetComponent(draggingMC:MovieClip):Component{
                 var mc:MovieClip = getDropTargetMovieClip(draggingMC);
                 if(mc != null){
//*************
//找到目标MC后,取得拥有此MC的组件,返回之.
                         return Component.getOwnerComponent(mc);
                 }
                 return null;
}

public static function getDropTargetMovieClip(draggingMC:MovieClip):MovieClip{
                 var target = getDropTarget(draggingMC);
                 if(target == null){
                         return null;
                 }else if(target instanceof MovieClip || typeof(target) == "movieclip"){
//*************
//如果目标是MC,则返回之
                         return target;
                 }else{
//*************
//如果目标不是MC,则取其父
                         return target._parent;
                 }
}

public static function getDropTarget(draggingMC:MovieClip){
                 if(draggingMC == null){
                         return null;
                 }else{
                         draggingMC.startDrag(false);
//*************
//最终找到我们的目标组件是使用MovieClip._droptarget 属性获取的.
                         var target = eval(draggingMC._droptarget);
                         draggingMC.stopDrag();
                         return target;
                 }
}
DragAndDropDemo源代码



import org.aswing.ASColor;
import org.aswing.border.LineBorder;
import org.aswing.BorderLayout;
import org.aswing.colorchooser.ColorRectIcon;
import org.aswing.Component;
import org.aswing.dnd.DragManager;
import org.aswing.dnd.SourceData;
import org.aswing.FlowLayout;
import org.aswing.geom.Point;
import org.aswing.JButton;
import org.aswing.JFrame;
import org.aswing.JPanel;
/**
* @author Msun
*/
class DragAndDropDemo extends JFrame {

         private var pane : JPanel ;
         private var dragBtn : JButton;

         public function DragAndDropDemo(){
                 super("Drag And Drop Demo");
                 init();
         }

         private function init() : Void{
                 //part 1 drag initiator
                 dragBtn = new JButton( "拖我到下边的Pane" );
                 var palletteIcon : ColorRectIcon = new ColorRectIcon(20, 20);
                 palletteIcon.setColor(ASColor.RED);
                 dragBtn.setIcon( palletteIcon );
                 dragBtn.setDragEnabled(true);
                 dragBtn.addEventListener(JButton.ON_DRAG_RECOGNIZED, __dragRecognized, this);
                
                 //part 2 drag target
                 pane = new JPanel(new FlowLayout());
                 pane.setDropTrigger( true );
                 pane.addDragAcceptableInitiator( dragBtn );
                 pane.addEventListener(JPanel.ON_DRAG_ENTER, __dragEnter, this);
                 pane.addEventListener(JPanel.ON_DRAG_OVERRING, __dragOverring, this);
                 pane.addEventListener(JPanel.ON_DRAG_EXIT, __dragExit, this);
                 pane.addEventListener(JPanel.ON_DRAG_DROP, __dragDrop, this);
                
                 //add these component into container
                 pane.setBorder(new LineBorder(null, new ASColor(0xFF6600), 2, 8));
                 var wapperPane : JPanel = new JPanel(new FlowLayout());
                 wapperPane.append(dragBtn);
                 this.getContentPane().append(wapperPane, BorderLayout.NORTH);
                 this.getContentPane().append(pane, BorderLayout.CENTER);

                 setSize(450,270);
                 show();                
         }
        
         /**
          * 监听到dragBtn的ON_DRAG_RECOGNIZED事件,将拖拽事件托管给DragManager。
          * @param dragInitiator          此例中是指dragBtn。
          * @param touchedChild    被鼠标拖住的组件,此例中亦是dragBtn。
          */
         private function __dragRecognized( dragInitiator : Component, touchedChild : Component ) : Void{
                 DragManager.startDrag( dragBtn , new SourceData("dragData", JButton(dragInitiator).getText() ), new WindowsDragImage( dragBtn ));
         }
        
         /**
          * 监听到dragBtn的ON_DRAG_ENTER事件 。
          */
         private function __dragEnter(source : Component, dragInitiator : Component, sourceData : SourceData, mousePos : Point) : Void{
                 __trace("ON_DRAG_ENTER", source, dragInitiator, sourceData, mousePos);
                 pane.setBorder(new LineBorder(null, new ASColor(0x0), 1, 8));
         }
        
         /**
          * 监听到dragBtn的ON_DRAG_OVERRING事件 。
          */
         private function __dragOverring(source : Component, dragInitiator : Component, sourceData : SourceData, mousePos : Point) : Void{
                 //__trace("ON_DRAG_OVERRING", source, dragInitiator, sourceData, mousePos);
         }
        
         /**
          * 监听到dragBtn的ON_DRAG_EXIT事件 。
          */
         private function __dragExit(source : Component, dragInitiator : Component, sourceData : SourceData, mousePos : Point) : Void{
                 __trace("ON_DRAG_EXIT", source, dragInitiator, sourceData, mousePos);
                 pane.setBorder(new LineBorder(null, new ASColor(0xFF6600), 2, 8));
         }
        
         /**
          * 监听到dragBtn的ON_DRAG_DROP事件,一般为处理拖拽事件的关键点。
          */
         private function __dragDrop(source : Component, dragInitiator : Component, sourceData : SourceData, mousePos : Point) : Void{
                 __trace("ON_DRAG_DROP", source, dragInitiator, sourceData, mousePos);
                 pane.setBorder(new LineBorder(null, new ASColor(0xFF6600), 2, 8));
                 pane.append(new JButton(sourceData.getData().toString()+(pane.getComponentCount()+1)));
         }
        
         /**
          * 内部方法,减少重复代码用。
          */
         private function __trace(eventName : String, source : Component, dragInitiator : Component, sourceData : SourceData, mousePos : Point ) : Void{
                 trace(eventName +":/n   source:"+source
                                             +"/n   dragInitiator:"+dragInitiator
                                                 +"/n   sourceData:"+sourceData
                                                 +"/n   mousePos:"+mousePos);
         }

         public static function main() : Void{
                 Stage.scaleMode = "noScale";
                 var dndDemo : DragAndDropDemo = new DragAndDropDemo();                
         }
        
}
WindowsDragImage 源代码



import org.aswing.ASColor;
import org.aswing.Component;
import org.aswing.dnd.DraggingImage;
import org.aswing.graphics.Graphics;
import org.aswing.graphics.Pen;
import org.aswing.graphics.SolidBrush;

import flash.display.BitmapData;

/**
* The Windows Style drag image.
* 参考DefaultDragImage
* @author Msun
*/
class WindowsDragImage implements DraggingImage {
         private var initiator : Component;
         private var target : MovieClip;
         private var dragImgMC : MovieClip;
         private var myBitmapData : BitmapData ;
         private var targetRejectMC : MovieClip;
         private var targetBmpMC : MovieClip;

         public function WindowsDragImage(dragInitiator : Component){
                 initiator = dragInitiator;
                 //以下几行是为了取得拖动Comonent的图像,并cacheAsBitmap,然后新建一个描绘此图像的BitmapData。
                 var o = dragInitiator;
                 dragImgMC = o.root_mc;
                 dragImgMC.cacheAsBitmap = true;
                 myBitmapData = new BitmapData(getImageWidth(), getImageHeight(), false, 0x00CCCC00);        
         }

         private function getImageWidth() : Number {
                 return initiator.getWidth();
         }

         private function getImageHeight() : Number {
                 return initiator.getHeight();
         }

         public function setCanvas(target : MovieClip) : Void {
                 this.target = target;
         }
        
         /**
          * 表现拖动组件被目标组件接受时的图像。
          */
         public function switchToAcceptImage() : Void {
                 __clear();
                 attachBmp(myBitmapData, dragImgMC);
         }
        
         /**
          * 表现拖动组件被目标组件不被接受时的图像。
          */
         public function switchToRejectImage() : Void {
                 __clear();
                 attachBmp(myBitmapData, dragImgMC);                
                 //新建targetRejectMC用以描绘“拒绝拖动的标志”
                 targetRejectMC = target.createEmptyMovieClip("targetRejectMC", target.getNextHighestDepth());
                 drawRejectIcon(new Graphics( targetRejectMC ), (getImageWidth() - 16), (getImageHeight() - 16)/2);
         }
        
         /**
          * 将拖动组件的图像描绘在setCanvas()传入的target MovieClip上。
          */
         private function attachBmp(bmpData : BitmapData, drawMC : MovieClip) : Void{
                 targetBmpMC = target.createEmptyMovieClip("targetBmpMC", target.getNextHighestDepth());
                 targetBmpMC._alpha = 75;
                 targetBmpMC.attachBitmap(bmpData, targetBmpMC.getNextHighestDepth(), "auto", true);
                 bmpData.draw( drawMC );
         }
        
         /**
          * 清除上次描绘的图像
          */
         private function __clear() : Void{
                 targetRejectMC.clear();
                 targetBmpMC.removeMovieClip();
                 target.clear();
         }
        
         /**
          * 画出类似于Windows中拒绝拖动的标志,一个圆及其中间一个向左倾斜45度的直线。
          */
         private function drawRejectIcon(g : Graphics, x : Number, y : Number) : Void{
                 var R : Number = 8.5; //reject circle radius is 8.5px
                 g.fillCircleRing(new SolidBrush(ASColor.BLACK ), x+R, y+R, R, R-2 );
                 g.drawLine(new Pen(ASColor.BLACK , 2, 100),
                                         Math.round( x+ 0.3*R ),
                                         Math.round( y+ 0.3*R ),
                                         Math.round( x+ 1.7*R ),
                                         Math.round( y+ 1.7*R));
         }
}
【ESP32】ESP32连接JY61P并通过WIFI发送给电脑 ESP32S连接JY61P并通过WIFI把姿态数据发送给电脑1.采用Arduino IDE编译器;需要安装ESP32的开发板管理器;2.电脑接受数据是基于python的; 阅读详情

相关推荐

trae使用playwright MCP方法流程

trae使用playwright MCP方法流程

MAILLIBIN的专栏 1677

PyQT5 (二十八) 让控件支持拖拽动作setDragEnabled 的案例

让控件支持拖拽动作 的案例 import sys from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QPainter, QBrush from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QFormLayout, QLabel, QLineEdit ''' 让控件支持拖拽动作 的案例 A.setDragEnabled(True) B.setAcceptD...

Ggome的博客 1248

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO 在之前的工作中有接触过LOAM,最近在工作中又接触到Faster LIO相关的工作,于是想着对Fast LIO / Fast LIO2 / Faster LIO这一系列工作进行一个简单的总结,以加深自己对激光SLAM算法的理解,之前总结过的一些和激光SLAM算法相关的博客还有,感兴趣的同学可以一起学习讨论: 激光SLAM总结——VLOAM / LIMO算法解析 激光SLAM总结——LIO-Mapping / LIOM /

weixin_44580210的博客 1万+

touch-action属性

CSS属性 touch-action 用于指定某个给定的区域是否允许用户操作,以及如何响应用户操作(比如浏览器自带的划动、缩放等)。 /* Keyword values */touch-action: auto;touch-action: none;touch-action: pan-x;touch-action: pan-left;touch-action: pan-right;...

qq_41662119的博客 897

EnlightenGAN训练复现记录

记录EnlightenGAN过程中的问题和解决方式。提示:以下是本篇文章正文内容,下面案例可供参考。

L_27N113E的博客 3847

鸿蒙日历组件进阶:教你打造个性化日程管理界面(支持月份切换)

本文深入探讨了鸿蒙应用开发中自定义日历组件的构建方法。通过详解基于Grid的布局设计、核心日期算法、月份切换逻辑以及事件管理集成,指导开发者打造支持个性化日程管理的高性能日历界面,提升应用交互体验。

weixin_29207149的博客 66

touch-action的属性和解决报错方法

报错问题:Unable to preventDefault inside passive event listener due to target being treated as passive. 发生情景:移动端弹窗垂直滚动时报错。 翻译的意思是:由于目标被视为被动,因此无法防止被动事件侦听器中的默认值。 解决办法: 在项目中的public文件夹中的index.html中添加 * { // touch-action用于指定某个给定的区域是否允许用户操作,以及如何响应用户操作(比

AkeDuan的博客 2422

A Mathematical Framework for Transformer Circuits—(二)

transformer数学理论框架

qq_42208244的博客 758

PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled属性的困惑

dragEnabled属性用于控制视图是否支持拖拽,可以通过dragEnabled()、setDragEnabled(bool enable)进行属性访问和设置。 dragEnabled属性很简单,但老猿采用QListView和QTableView验证后,发现该属性实际上没有什么作用 ...

老猿Python 1762

一篇关于轴承故障诊断的综述

在设备的故障检测中,有约30%-40%的设备故障是由轴承故障引起的,因此本文将列举有关检测轴承故障使用到的相关数据集,模型和算法。 数据集 现有的数据集,普遍由固定在电机马达上的两个震动检测器获得,并根据需要,分离震动数据在时域和频域上的特征以供网络模型学习。 不同的数据集,区别在于,检测的马达转速不同,环境不同,取样频率不同,一段样本的时长不同等等 (1)Case Western Reserve University (CWRU) Dataset 该数据集拥有多种数据,测量的时候,通过改变轴承.

weixin_42036144的博客 2万+

工作之余的随想:AI 会终结 SAP 顾问吗?

本文是笔者工作之余的一些胡思乱想。昨晚(准确的说是今日凌晨),我又熬了一个夜。没办法,接到一个影响客户项目上线的紧急 incident,花了我好长时间,竟然一点头绪都没有。苦苦思索的过程,时间过得飞快。一转眼就晚上11:30 了。要说我 2007 年还在研三实习期间,就进入了 SAP 行业,到今天已经摸爬滚打 18 年了,按理说也算身经百战了,可以说处理过很多 SAP 客户使用系统时遇到的各种稀奇古怪的问题。但即便这样,我也时常在工作中遇到一开始感到无从下手的问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1264

Qt应用开发(基础篇)——行文本编辑框 QLineEdit

QLineEdit允许用户输入和编辑单行纯文本,并可以使用快捷编辑功能,包括复制、粘贴、剪切和拖放。是项目开发中最常用的输入控件。默认键绑定描述如下。Left Arrow//将光标向左移动一个字符。//将文本向左移动并选择一个字符。//将光标向右移动一个字符。//向右移动并选择文本一个字符。Home//将光标移动到行首。End//将光标移动到行尾。Backspace//删除光标左侧的字符。//删除光标左侧的单词。Delete//删除光标右侧的字符。//删除光标右侧的单词。Ctrl+A。

波塞冬的博客 3553

VMware下载与安装

一、VMware下载 二、VMware安装

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 315

Qt拖放操作

通过最简单的QTreeView的相关操作来描述Qt里的拖放操作的实现原理。

studyhardi的博客 1988

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

pyqt5教程12:拖放功能

在窗口编程中,拖放是图形用户界面的一部分。拖放操作使用户能够直观地做复杂的事情。拖放功能显得特别酷,还有些神秘,本篇我们将讨论拖放操作,供初学者模仿。

gongdiwudu的专栏 8099

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

How To Drag and Drop Sprites with Cocos2D

<br />How To Drag and Drop Sprites with Cocos2D<br />Like this post? Follow me on Twitter!<br />Drag and drop these cute pets with Cocos2D!<br />I’ve received several requests to write a tutorial on how to move sprites in Cocos2D by dragging them with touc

waleywen的专栏 2648

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

PyQt6 中的拖拽操作

本章教程,讲的是 PyQt6 中的拖拽操作。计算机图形界面中,拖拽操作是点击一个对象不放,把它放在另外一个地方或者另外一个对象上面的操作。一般来说,这会触发很多类型的行为,或者在两个对象上建立多种关系。在计算机图形用户界面中,拖放是(或支持)点击虚拟对象并将其拖到不同位置或另一个虚拟对象上的动作。一般来说,它可以用来调用多种动作,或者在两个抽象对象之间创建各种类型的关联。拖放是图形界面的一部分,使用户能够直观地做复杂的事情。通常,我们可以拖放两个东西:数据或图形对象。

白话机器学习 576

前端报错adding CSS “touch-action: none“ to this element解决方案

报错定位:本人在这个页面引入了一个组件,而那个组件是需要进行拖拽或者滑动之类的操作,在此之前没有出现报错的,应该就是这里的问题... 这应该与浏览器尝试优化滚动性能或触摸事件的处理有关...

qq_71214810的博客 1211

基本Widgets(28):【类】QLineEdit [官翻]

文章目录详细说明公共类型enum ActionPositionenum EchoMode属性公共函数构造和析构属性相关其他编辑功能数据约束光标操作重写的公共函数公共槽信号受保护的函数重写的受保护的函数相关代码参考 QLineEdit Class QLineEdit小部件是一个单行文本编辑器。 Header #include < QLineEdit > qmake QT += widgets Inherits QWidget Inherited By 详细说

读书笔记 1094

QT QLineEdit使用详解

QLineEdit允许用户输入和编辑单行纯文本,提供了很多有用的编辑功能,包括:边框、密码框、限制输入类型、对齐方式、验证器的使用、撤消和重做、剪切和粘贴、以及拖放(setDragEnabled())通过改变输入框的echoMode(),同时也可以设置为一个“只写”字段,用于输入密码等。本文详细的介绍了QLineEdit控件的各种操作,例如:编辑框的状态、边框、密码框、限制输入类型、对齐方式、验证器的使用、样式表的应用等操作。类型限制,可以限制数字、英文范围,还可以限制输入类型。限制可以输入的字节数。

断点 1万+

自定义控件——可拖拽排序的ListView (在ListView的item中没有EditText控件)

前言 最经公司项目钟有一个需求:在ListView的item中有EditText控件,然后实现listview拖拽效果,研究了好久拖拽排序的ListView;目前还只会没有EditText控件的listview的拖拽,实现步骤如下: 一:在MainActivity中; public class MainActivity extends AppCompatActivity { privat

学习就是我的个性 463

Swing学习笔记(1)拖-放:基本原理

Swing对于拖放的支持是内置的,功能很强大,很多控件都内置了拖放操作的支持,包括:JColorChooser、JEditorPane、JFileChooser、JFormattedTextField、JList、JTable、JTextArea、JTextField、JTextPane、JTree。而copy-paste在Swing中也属于拖放操作的范畴。不过,默认情况下,Swing组件的拖放功

kingfox的专栏 1929

关于css中touch-action属性 在移动端开发中遇到的问题

初次接触第一次接触touch-action这个属性 是在之前一个网约车公众号项目中遇到的 当时采用的是vue做框架 cube-ui做组件库当时在版本迭代的时候增加了余额支付的功能 需要一个密码键盘 种种原因没有引入第三方插件  而是选择了手写样式如下图:当连续快速点击某个数字时,在ios端出现了强制缩放,百度一圈发现了这个属性,*{touch-action: manipulation}加上之后很管...

perry的博客 8970

Java中的Drag and Drop详解…

博主写得很详细,最近正在为这个头疼,看了这个终于搞清楚了原文地址:and Drop详解与代码示例">Java中的Drag and Drop详解与代码示例作者:SuRen对对Java中的Drag and Drop做了一个总结, 觉得大致可以通过两种方法实现Drag and Drop:  1.比较初级的D&D:只利用java.awt.datatransfer.*中的类实现.  2.高级D&D: 利用

胖大星的博客 2802

安卓实现任意控件view可拖拽,并监听拖拽和点击事件,可自动拉回屏幕边缘

因为项目中有需要实现控件可任意拖拽的需求,所以简单写了个自定义OnTouchListener,以作抛砖引玉,欢迎大家提议反馈。 完整实现类如下,代码中有详细注释: 用户可以决定是否开启自动拖拽边缘功能,可以监听控件的拖拽和点击事件 public class OnDragTouchListener implements View.OnTouchListener { private int ...

weixin_33895657的博客 911

Swing-实现拖拽支持

目录 一、创建拖拽源 二、创建拖放目标 三、处理拖拽数据 四、图片的拖拽 一、创建拖拽源 DragSource : 拖放操作的源窗口 DropTarget :拖放操作的目标窗口 Transferable : 传递物,传递的数据 创建拖放源,仅窗口支持拖放操作 1、创建DragSource 2、创建Transferable 3、开始拖拽操作startDrag 核心...

给你更好的 2353
上一篇: 使用 Flex Builder 3.x 分析工具 Profile
下一篇: aswing换肤
blacksource
博客等级 码龄20年 66粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值