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中的super()方法使用简介
Aug 14 Python
Python脚本实现自动将数据库备份到 Dropbox
Feb 06 Python
对python中return和print的一些理解
Aug 18 Python
django定期执行任务(实例讲解)
Nov 03 Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
Python实现获取邮箱内容并解析的方法示例
Jun 16 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
python傅里叶变换FFT绘制频谱图
Jul 19 Python
Django之form组件自动校验数据实现
Jan 14 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
Apr 26 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
PHP伪静态写法附代码
2008/06/20 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
php过滤敏感词的示例
2014/03/31 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
PHP中的替代语法简介
2014/08/22 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
jQuery.extend 函数详解
2012/02/03 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
微信小程序的mpvue框架快速上手指南
2019/05/15 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
详解python中的文件与目录操作
2017/07/11 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
python能自学吗
2020/06/18 Python
Java中实现多态的机制
2015/08/09 面试题
企业消防安全制度
2014/02/02 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
财务管理制度范本
2015/08/04 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
JS实现九宫格拼图游戏
2022/06/28 Javascript