python GUI库图形界面开发之PyQt5拖放控件实例详解
作者:州的先生 发布时间:2023-04-26 08:43:24
本篇,我们学习PyQt5界面中拖放(Drag 和Drop)控件。
拖放动作
在GUI中,拖放指的是点击一个对象,并将其拖动到另一个对象上的动作。比如百度云PC客户端支持的拖放文件以快速移动文件:
拖放动作能够很直观很方便的在GUI程序中完成一些很复杂或繁琐的操作。
在PyQt中实现拖放
在PyQt5中,我们也可以很轻松地使用拖放功能。
使用Qt设计师或者使用API都可以实现。我们先使用Qt设计师将GUI的图形设计出来,在之前的GUI的基础上,我们新建一个选项卡。
我们新建了一个选项卡,然后在里面放置了一个LineEdit部件,一个PushButton部件,两个ListWidget部件。
对于简单的拖放效果,我们可以直接使用Qt设计师中的选项进行设置。例如,我们直接可以使用dragEnable属性、dragDropOverwriteMode属性、dragDropMode属性为ListWidget部件设置拖放功能:
而一些稍微复杂的拖放功能,就需要编写Python逻辑处理代码来完成了。
我们先将UI文件保存并转换为Python文件。
pyuic5 -o conplex_window_drag.py conplex_window.ui
然后,新建一个Python文嘉drag.py,在文件中引入刚刚转换好的Python文件:
# coding:utf-8
# 州的先生 zmister.com Python GUI教程
from PyQt5 import QtCore,QtWidgets,QtGui
from GUI import conplex_window_drag
import sys
import time
class MainWindow(object):
def __init__(self):
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
self.ui = conplex_window_drag.Ui_MainWindow()
self.ui.setupUi(MainWindow)
self.update_date()
self.update_calendar()
self.set_lcd()
self.set_dial()
self.update_progressbar()
self.set_font()
MainWindow.show()
sys.exit(app.exec_())
# 修改日期修改器数值
def update_date(self):
self.ui.dateEdit.setDate(self.ui.calendarWidget.selectedDate())
# 日历信号槽
def update_calendar(self):
self.ui.calendarWidget.selectionChanged.connect(self.update_date)
# 设置LCD数字
def set_lcd(self):
self.ui.lcdNumber.display(self.ui.dial.value())
# 刻度盘信号槽
def set_dial(self):
self.ui.dial.valueChanged['int'].connect(self.set_lcd)
# 州的先生 zmister.com
# 按钮信号槽
def update_progressbar(self):
self.ui.radioButton.clicked.connect(self.start_progressbar)
self.ui.radioButton_2.clicked.connect(self.stop_progressbar)
self.ui.radioButton_3.clicked.connect(self.reset_progressbar)
self.progress_value = 0
self.stop_progress = False
def progressbar_counter(self, start_value=0):
self.run_thread = RunThread(parent=None, counter_start=start_value)
self.run_thread.start()
self.run_thread.counter_value.connect(self.set_progressbar)
def set_progressbar(self, counter):
if not self.stop_progress:
self.ui.progressBar.setValue(counter)
# 启动进度栏
def start_progressbar(self):
self.stop_progress = False
self.progress_value = self.ui.progressBar.value()
self.progressbar_counter(self.progress_value)
# 停止进度栏
def stop_progressbar(self):
self.stop_progress = True
try:
self.run_thread.stop()
except:
pass
# 重设进度栏
def reset_progressbar(self):
self.stop_progressbar()
self.progress_value = 0
self.ui.progressBar.reset()
self.stop_progress = False
# 字体选择
def set_font(self):
self.ui.fontComboBox.activated['QString'].connect(self.ui.label.setText)
class RunThread(QtCore.QThread):
# 定义一个新的信号
counter_value = QtCore.pyqtSignal(int)
def __init__(self, parent=None, counter_start=0):
super(RunThread, self).__init__(parent)
self.counter = counter_start
self.is_running = True
def run(self):
while self.counter < 100 and self.is_running == True:
time.sleep(0.1)
self.counter += 1
print(self.counter)
# 发出一个新值的信号
self.counter_value.emit(self.counter)
def stop(self):
self.is_running = False
print('线程停止中...')
self.terminate()
if __name__ == "__main__":
MainWindow()
运行代码正常:
接着,我们创建一个DragDropButton()类,用来处理按钮的拖放:
class DragDropButton(QtWidgets.QPushButton):
def __init__(self, text, parent):
super().__init__(text, parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasFormat('text/plain'):
event.accept()
else:
event.ignore()
def dropEvent(self, event):
self.setText(event.mimeData().text())
我们使用setAcceptDrops属性设置按钮接收拖放事件,创建一个dragEnterEvent()方法用来设置拖的事件响应,创建一个dropEvent()方法用来设置放的事件响应。
接着我们在MainWindow()主类中,调用它:
class MainWindow(object):
def __init__(self):
……
self.ui.pushButton.hide()
self.pushButton = DragDropButton("拖放按钮",MainWindow)
self.ui.gridLayout_5.addWidget(self.pushButton,0, 1, 1, 2)
……
最后,运行一下看看:
在上面的程序中,我们能够将文本拖放到按钮上。
好了python GUI库图形界面开发中PyQt5拖放控件的实例就是这些,更多关于python PyQt5 GUI库图形界面开发请查看下面的相关链接
来源:https://zmister.com/archives/186.html


猜你喜欢
- 从百度百科中扣去的这个图片轮播代码,图片向左不间断滚动,有停顿:<!DOCTYPE html PUBLIC "-//W3C/
- 字体设计是人类商业活动的需求,它随着时代和科学技术的进步而不断地变化着。被广泛应用于网络生活的各个方面。现代字体设计在计算机技术的应用中已经
- 1. 根据字符串名称 动态调用 python文件内的方法eval("function_name")(参数)2. 根据字符
- 方式1.打开Windows的cmd,在cmd中输入jupyter notebook --generate-config如下图:
- 我们都知道tensorflow框架可以使用tensorboard这一高级的可视化的工具,为了使用tensorboard这一套完美的可视化工具
- 官方文档:https://elasticsearch-py.readthedocs.io/en/master/1、介绍python提供了操作
- 前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明显的明暗不同的区域,如下图可以
- ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库的产生而产生, 随着数据库的变化而变化, 体现为sys用户下的一些表和视图。数
- 前言由于项目需要生成多条数据,并保存到数据库当中,在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,项目使用了Sp
- 一、模型参数的保存和加载 torch.save(module.state_dict(), path):使用module.state
- 我是通过beego框架,将请求过来的json进行解析,并将值保存在结构体中--------------------1------------
- 1. 概述Promise对象是ES6提出的的异步编程的规范。说到异步编程,就不得不说说同步和异步这两个概念。从字面意思理解同步编程的话,似乎
- 先看一个js函数 function jsontest() { var json = [{'username':'cr
- 导语也许是为了和音,在立冬这一天的人间里北方多个城市,悄然降下冬天的第一场初雪,组成了一段旋律💨一天过两季,黄叶转飞花——从天而降落,昼夜不
- 本文实例讲述了Python实现的企业粉丝抽奖功能。分享给大家供大家参考,具体如下:一 代码def scode9(schoice): &nbs
- 内容摘要:在本人上一篇教程《彻底弄懂CSS盒子模式五(定位强化练习) 》有讲到一个很酷的链接面板提示的实例制作,那时主要是用到di
- 需求开发过程中开发者经常面对的一个需求就是:一个项目可能会在不同的环境下运行,本地开发环境、测试环境、灰度环境、生产环境。每个环境的参数和配
- 通过本篇内容给大家介绍一下Python实现金融数据可视化中两列数据的提取、分别画、双坐标轴、双图、两种不同的图等代码写法和思路总结。impo
- 占位符说明1、%c,格式化字符及其ASCII码2、%s,格式化字符串3、%d,格式化整数4、%u,格式化无符号整数5、%o,格式化无符号八进
- 一、web.py简介web.py是一款轻量级的Python web开发框架,简单、高效、学习成本低,特别适合作为python web开发的入