python GUI库图形界面开发之PyQt5拖放控件实例详解


Posted in Python onFebruary 25, 2020

本篇,我们学习PyQt5界面中拖放(Drag 和Drop)控件。

拖放动作

在GUI中,拖放指的是点击一个对象,并将其拖动到另一个对象上的动作。比如百度云PC客户端支持的拖放文件以快速移动文件:

python GUI库图形界面开发之PyQt5拖放控件实例详解

拖放动作能够很直观很方便的在GUI程序中完成一些很复杂或繁琐的操作。

在PyQt中实现拖放

在PyQt5中,我们也可以很轻松地使用拖放功能。

使用Qt设计师或者使用API都可以实现。我们先使用Qt设计师将GUI的图形设计出来,在之前的GUI的基础上,我们新建一个选项卡。

python GUI库图形界面开发之PyQt5拖放控件实例详解

我们新建了一个选项卡,然后在里面放置了一个LineEdit部件,一个PushButton部件,两个ListWidget部件。

对于简单的拖放效果,我们可以直接使用Qt设计师中的选项进行设置。例如,我们直接可以使用dragEnable属性、dragDropOverwriteMode属性、dragDropMode属性为ListWidget部件设置拖放功能:

python GUI库图形界面开发之PyQt5拖放控件实例详解

而一些稍微复杂的拖放功能,就需要编写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()

运行代码正常:

python GUI库图形界面开发之PyQt5拖放控件实例详解

接着,我们创建一个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 GUI库图形界面开发中PyQt5拖放控件的实例就是这些,更多关于python PyQt5 GUI库图形界面开发请查看下面的相关链接

Python 相关文章推荐
python中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
Django接收post前端返回的json格式数据代码实现
Jul 31 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
python随机数分布random均匀分布实例
Nov 27 Python
Python hashlib模块实例使用详解
Dec 24 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
Expected conditions模块使用方法汇总代码解析
Aug 13 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 #Python
Python对wav文件的重采样实例
Feb 25 #Python
python实现打砖块游戏
Feb 25 #Python
Python实现企业微信机器人每天定时发消息实例
Feb 25 #Python
Django 设置多环境配置文件载入问题
Feb 25 #Python
python中resample函数实现重采样和降采样代码
Feb 25 #Python
python实现的分层随机抽样案例
Feb 25 #Python
You might like
mysql建立外键
2006/11/25 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
全面分析JavaScript 继承
2019/05/30 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
python中sys.argv函数精简概括
2018/07/08 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
python实现学生管理系统开发
2020/07/24 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
2020/09/02 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
eBay加拿大站:eBay.ca
2019/06/20 全球购物
DataList 能否分页,请问如何实现?
2015/05/03 面试题
数控专业大学生的自我鉴定
2013/11/13 职场文书
幼儿园教学随笔感言
2014/02/23 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
Java 数组内置函数toArray详解
2021/06/28 Java/Android
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技