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爬取NUS-WIDE数据库图片
Oct 05 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 Python
python中lambda()的用法
Nov 16 Python
深入理解Python中的super()方法
Nov 20 Python
Python实现将doc转化pdf格式文档的方法
Jan 19 Python
python K近邻算法的kd树实现
Sep 06 Python
用sqlalchemy构建Django连接池的实例
Aug 29 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
Django Auth用户认证组件实现代码
Oct 13 Python
python 进程池pool使用详解
Oct 15 Python
python 操作excel表格的方法
Dec 05 Python
用Python实现一个打字速度测试工具来测试你的手速
May 28 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
Array of country list in PHP with Zend Framework
2011/10/17 PHP
php获得url参数中具有&amp;的值的方法
2014/03/05 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
js使用递归解析xml
2014/12/12 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
Sea.JS知识总结
2016/05/05 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
JavaScript 五大常见函数
2018/03/23 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
es6数值的扩展方法
2019/03/11 Javascript
Vue 实例中使用$refs的注意事项
2021/01/29 Vue.js
Python中的高级函数map/reduce使用实例
2015/04/13 Python
Python中__new__与__init__方法的区别详解
2015/05/04 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
儿童学习python的一些小技巧
2018/05/27 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
任意存:BOXFUL
2018/05/21 全球购物
大学生心理活动总结
2014/07/04 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技