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 相关文章推荐
Python3.x和Python2.x的区别介绍
Feb 12 Python
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
在Django的form中使用CSS进行设计的方法
Jul 18 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
Jun 13 Python
Python 判断文件或目录是否存在的实例代码
Jul 19 Python
python 返回列表中某个值的索引方法
Nov 07 Python
python单线程文件传输的实例(C/S)
Feb 13 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
Python3.5装饰器原理及应用实例详解
Apr 30 Python
python两种获取剪贴板内容的方法
Nov 06 Python
通过代码简单了解django model序列化作用
Nov 12 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
也谈php网站在线人数统计
2008/04/09 PHP
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
javascript中的原型链深入理解
2014/02/24 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
[05:02]2014DOTA2 TI中国区预选赛精彩TOPPLAY第三弹
2014/06/25 DOTA
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
简单解决Python文件中文编码问题
2015/11/22 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
python3注册全局热键的实现
2020/03/22 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
Python中如何添加自定义模块
2020/06/09 Python
Collection和Collections的区别
2016/05/02 面试题
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
俄语专业职业生涯规划
2014/02/26 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
唐山大地震观后感
2015/06/05 职场文书
母亲节主题班会
2015/08/14 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
JavaScript实现优先级队列
2021/12/06 Javascript