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定时检查启动某个exe程序适合检测exe是否挂了
Jan 21 Python
使用Python编写vim插件的简单示例
Apr 17 Python
python获取指定路径下所有指定后缀文件的方法
May 26 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 Python
kaggle+mnist实现手写字体识别
Jul 26 Python
python实现录音小程序
Oct 26 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
python实现网页录音效果
Oct 26 Python
编写python程序的90条建议
Apr 14 Python
Python 循环读取数据内存不足的解决方案
May 25 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源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
Python实现读取Properties配置文件的方法
2018/03/29 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
开工庆典邀请函范文
2014/01/16 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
mysql脏页是什么
2021/07/26 MySQL
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL