如何复制 - 粘贴由 QStandardItemModel 创建的 QTableView 中的多个项目到文本/excel 文件?

2024-03-02

如何将 QTableView 的多个项目/值复制并粘贴到文本/ Excel 文件?

My Code:

tab_table_view = QtGui.QWidget()
self.Tab.insertTab(0, tab_table_view, self.File_Name)
self.tableView = QtGui.QTableView(tab_table_view)
self.tableView.setGeometry(QtCore.QRect(0, 0, 721, 571))
self.model = QtGui.QStandardItemModel(self)
self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection

This line self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection helps with selecting multiple items in QTableView but when I do CTRL+C and paste it only pastes the last item or value of the selection?

我见过这条线self.tableView.setEditTriggers(QAbstractItemView.AllEditTriggers)但这仅适用于表中的单个项目并忽略扩展选择。

请帮助我这是我第二次发布这个问题。现在,我想知道这是否可能?请告诉我任何人!


这里的困难在于表中选定的单元格可能是不连续的并且不按任何特定顺序。因此,任务是计算包含所有选定单元格的最小矩形,然后根据适合传递给 csv 编写器的数据结构创建数据结构。

下面是一个执行此操作的演示脚本(基于此之前的回答 https://stackoverflow.com/a/40389568/984421- 补充内容已被评论):

PyQt4:

# add imports
import sys, csv, io
import pandas as pd, numpy as np
from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.model = QtGui.QStandardItemModel(self)
        self.model.setSortRole(QtCore.Qt.UserRole)
        self.tableView = QtGui.QTableView()
        self.tableView.setSortingEnabled(True)
        self.tableView.setModel(self.model)
        # install event filter
        self.tableView.installEventFilter(self)
        self.button = QtGui.QPushButton('Open CSV', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.tableView)
        layout.addWidget(self.button)

    # add event filter
    def eventFilter(self, source, event):
        if (event.type() == QtCore.QEvent.KeyPress and
            event.matches(QtGui.QKeySequence.Copy)):
            self.copySelection()
            return True
        return super(Window, self).eventFilter(source, event)

    # add copy method
    def copySelection(self):
        selection = self.tableView.selectedIndexes()
        if selection:
            rows = sorted(index.row() for index in selection)
            columns = sorted(index.column() for index in selection)
            rowcount = rows[-1] - rows[0] + 1
            colcount = columns[-1] - columns[0] + 1
            table = [[''] * colcount for _ in range(rowcount)]
            for index in selection:
                row = index.row() - rows[0]
                column = index.column() - columns[0]
                table[row][column] = index.data()
            stream = io.StringIO()
            csv.writer(stream).writerows(table)
            QtGui.qApp.clipboard().setText(stream.getvalue())

    def handleButton(self):
        filters = (
            'CSV files (*.csv *.txt)',
            'Excel Files (*.xls *.xml *.xlsx *.xlsm)',
            )
        path, filter = QtGui.QFileDialog.getOpenFileNameAndFilter(
            self, 'Open File', '', ';;'.join(filters))
        if path:
            csv = filter.startswith('CSV')
            if csv:
                dataframe = pd.read_csv(path)
            else:
                dataframe = pd.read_excel(path)
            self.model.setRowCount(0)
            dateformat = '%m/%d/%Y'
            rows, columns = dataframe.shape
            for row in range(rows):
                items = []
                for column in range(columns):
                    field = dataframe.iat[row, column]
                    if csv and isinstance(field, str):
                        try:
                            field = pd.to_datetime(field, format=dateformat)
                        except ValueError:
                            pass
                    if isinstance(field, pd.tslib.Timestamp):
                        text = field.strftime(dateformat)
                        data = field.timestamp()
                    else:
                        text = str(field)
                        if isinstance(field, np.number):
                            data = field.item()
                        else:
                            data = text
                    item = QtGui.QStandardItem(text)
                    item.setData(data, QtCore.Qt.UserRole)
                    items.append(item)
                self.model.appendRow(items)

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 150, 600, 400)
    window.show()
    sys.exit(app.exec_())

PyQt5:

# add imports
import sys, csv, io
import pandas as pd, numpy as np
from PyQt5 import QtCore, QtGui, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.model = QtGui.QStandardItemModel(self)
        self.model.setSortRole(QtCore.Qt.UserRole)
        self.tableView = QtWidgets.QTableView()
        self.tableView.setSortingEnabled(True)
        self.tableView.setModel(self.model)
        # install event filter
        self.tableView.installEventFilter(self)
        self.button = QtWidgets.QPushButton('Open CSV', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.tableView)
        layout.addWidget(self.button)

    # add event filter
    def eventFilter(self, source, event):
        if (event.type() == QtCore.QEvent.KeyPress and
            event.matches(QtGui.QKeySequence.Copy)):
            self.copySelection()
            return True
        return super(Window, self).eventFilter(source, event)

    # add copy method
    def copySelection(self):
        selection = self.tableView.selectedIndexes()
        if selection:
            rows = sorted(index.row() for index in selection)
            columns = sorted(index.column() for index in selection)
            rowcount = rows[-1] - rows[0] + 1
            colcount = columns[-1] - columns[0] + 1
            table = [[''] * colcount for _ in range(rowcount)]
            for index in selection:
                row = index.row() - rows[0]
                column = index.column() - columns[0]
                table[row][column] = index.data()
            stream = io.StringIO()
            csv.writer(stream).writerows(table)
            QtWidgets.qApp.clipboard().setText(stream.getvalue())

    def handleButton(self):
        filters = (
            'CSV files (*.csv *.txt)',
            'Excel Files (*.xls *.xml *.xlsx *.xlsm)',
            )
        path, filter = QtWidgets.QFileDialog.getOpenFileName(
            self, 'Open File', '', ';;'.join(filters))
        if path:
            csv = filter.startswith('CSV')
            if csv:
                dataframe = pd.read_csv(path)
            else:
                dataframe = pd.read_excel(path)
            self.model.setRowCount(0)
            dateformat = '%m/%d/%Y'
            rows, columns = dataframe.shape
            for row in range(rows):
                items = []
                for column in range(columns):
                    field = dataframe.iat[row, column]
                    if csv and isinstance(field, str):
                        try:
                            field = pd.to_datetime(field, format=dateformat)
                        except ValueError:
                            pass
                    if isinstance(field, pd.Timestamp):
                        text = field.strftime(dateformat)
                        data = field.timestamp()
                    else:
                        text = str(field)
                        if isinstance(field, np.number):
                            data = field.item()
                        else:
                            data = text
                    item = QtGui.QStandardItem(text)
                    item.setData(data, QtCore.Qt.UserRole)
                    items.append(item)
                self.model.appendRow(items)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 150, 600, 400)
    window.show()
    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何复制 - 粘贴由 QStandardItemModel 创建的 QTableView 中的多个项目到文本/excel 文件? 的相关文章

  • 如何在辅助显示器上全屏显示图像?

    如何使用 PyQt5 PySide 或任何其他 Python 库在辅助 显示器上以全屏模式显示所需的图像 过去 我使用帧缓冲区图像查看器 Fbi https manpages ubuntu com manpages bionic man1
  • PyQt - 如何检查 QDialog 是否可见?

    我有个问题 我有这个代码 balls Ball for i in range 1 10 因此 当我说 Ball 时 这将在 QDialog 上绘制一个球 然后当这完成后 我正在移动球QDialog无限循环中 我想说类似的话while QDi
  • 如何将图标放置到 QLineEdit 上?

    stackoverflow com 网站的右上角有一个带有放大镜头的搜索字段和一个灰色的 搜索 关键字 我想知道是否有可能实现相同的外观QLineEdit 如果是这样那怎么办 QLineEdit lineEdit new QLineEdit
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • 使用 Pyqt4 从 URL 下载数千个 PDF

    理想情况下 我试图从给定网站下载数千个 PDF 然而 由于某种原因 它甚至无法下载 100 个 PDF 我不知道为什么 这是代码 usr bin env python import time from pyPdf import PdfFil
  • 变量值更改时的 PyQt 事件

    我有一个变量 t t 0 我想在 t 值发生变化时启动一个事件 如何 没有 valuechanged connect 属性或任何变量 对于全局变量 单独使用赋值是不可能的 但对于属性来说非常简单 只需使用property https doc
  • 如何在 QTableView 标题中单击鼠标右键单击上下文菜单?

    下面的示例代码 很大程度上受到here http www saltycrane com blog 2007 12 pyqt 43 qtableview qabstracttablemodel 有一个右键单击上下文菜单 当用户单击表中的单元格
  • 使用 PyQt 和 matplotlib 在可滚动小部件中显示多个绘图

    由于我没有得到答案this https stackoverflow com questions 12179893 creating a scrollable multiplot with pythons pylab我尝试用 PyQt 解决这
  • 如何从 QLineEdit 动态获取文本? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 怎样才能得到String Text from QlineEdit 我尝试过像这样 myArea getList 功能是获取字符串值并使用字符
  • 对于 `mouseMoveEvent()` 来说鼠标移动太快

    以下是 Python 3 版本 UI XML 代码显示 4QProgessBar对于每个鼠标方向 标记为 X X Y Y 快速移动鼠标 以圆圈形式 将使 4QProgessBar上升到 99 然后是一些QProgessBar休息一下 直到鼠
  • setColumnStretch 和 setRowStretch 如何工作

    我有一个使用构建的应用程序PySide2它使用setColumnStretch用于柱拉伸和setRowStretch用于行拉伸 它工作得很好 但我无法理解它是如何工作的 我参考了 qt 文档 但它对我没有帮助 我被困在括号内的两个值上 例如
  • Qt ObjectName() 必须是唯一的吗?

    如标题所示的简单问题 如果我打电话setObjectName 在一个对象上 它是否必须是唯一的 或者只是因为约定而推荐 我已经子类化了QLabel 并希望自动为创建的对象命名 如果这是一个坏主意 我会找到一些设置随机唯一名称的方法 我实际上
  • 取消选中单选按钮 - PyQt4

    在此代码示例中 from PyQt4 QtGui import QDialog QPushButton QRadioButton QHBoxLayout QApplication QButtonGroup import sys class
  • 在 PyQt 中使用 Windows 7 任务栏功能

    我正在寻找有关将一些新的 Windows 7 任务栏功能集成到我的 PyQt 应用程序中的信息 具体来说 如果已经存在使用新进度指示器的可能性 see here http www petri co il wp content uploads
  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • PyQt5安装错误(QtCore模块错误:无法创建C++代码)

    我正在尝试在我的 PC 上安装 PyQt5 以访问 QtDesigner 我在安装过程中遇到以下错误 python3 configure py qmake usr local Cellar qt 5 10 1 bin qmake sip u
  • QComboBox 下拉项边距

    我想设计我的风格QComboBox为下拉项目留出边距 现在是这样的 我想要这样的东西 我尝试过 QComboBox QAbstractItemView item margin 3px 但它不起作用 你能帮我解决这个问题吗 您想在项目之间设置
  • 使用自定义 HeaderView 时列排序不起作用

    我正在尝试创建一个TableView具有排序功能 如果我设置TableViewobj 我的自定义HeaderView 单击标题不会排序 即使我的自定义HeaderView不重新实现任何内容 如果我用TableView的标头 hh tv ho
  • PyQt5:在运行时更新标签

    我在运行时循环更新标签时遇到问题 我想我需要使用信号等等 但我已经尝试了我现在能想到的一切 我希望我的程序做什么 当我单击按钮时 应该启动一个循环来运行一些需要一些时间的函数 当函数运行时 相应的标签应更新其文本以显示 正在运行 当其完成时

随机推荐

  • 使用 Hibernate 和 spring 检查数据库中是否存在行的最快方法是什么?

    我需要以非常快的方式检查数据库中是否存在一行 假设我有主键 我在 Hibernate 的 FAQ 网站上找到了这段代码片段 Integer count Integer session createQuery select count fro
  • 禁用 Doctrine 外键约束

    我与我的一个模型有关系 ORM ManyToOne targetEntity Page cascade persist ORM JoinColumn name page id referencedColumnName id private
  • 如何执行没有返回类型或回调的 DELETE 请求? [改造]

    我需要使用 Retrofit 执行 DELETE 请求 所以 我的界面代码片段如下所示 DELETE api item id void deleteItem Path id int itemId 但我收到错误 java lang Illeg
  • 如何随机放置UIButton和值

    我有一个问题视图 将显示 4 个答案 只有 1 个是正确的 但我不希望同一个按钮始终是正确的答案 我想知道如何每次随机放置 4 个 UIButton 和值 当用户再次进入这个问题时 答案将在不同的按钮中 我的 X y W H 位置 按钮1
  • LC.exe 无法运行

    编译时我收到错误LC EXE http msdn microsoft com en us library ha0k3c9f v vs 80 aspx The specified task executable LC exe could no
  • 过滤和分页

    大家好 感谢您的帮助 我正在尝试实现一个简单的分页过滤器 按类别隐藏 li 例子是here http jsfiddle net vU9Hv 11 我是这方面的新手 但在一些帮助下 主要想法正在发挥作用 唯一的问题是 当我单击过滤时 我只想对
  • 通过 AJAX 下载 CSV

    您可以使用 AJAX 从 Web 应用程序下载生成的 csv 文件吗 如果是的话 有人可以向我指出任何类型的参考吗 编辑 抱歉 我应该提到我正在使用 Prototype 的 Ajax Request 我查看了 firebug 的响应工具 生
  • 根据 R 中的条件选择列表的嵌套子列表

    我有以下嵌套列表的简单示例 list list structure list group a def control Names c group def list structure list group b def disease1 Na
  • 如何解决“LINQ to Entities 中的排序输入仅支持方法‘Skip’”。

    当我使用 LINQ toEntity 显示每个产品并在 ASP NET MVC 中实现分页时 出现此错误 The method Skip is only supported for sorted input in LINQ to Entit
  • 文本色调的 CSS 等效项

    我正在尝试将文件从 Adob e InDesign 导出到基本 HTML CSS 用户可以选择一些文本并更改文本颜色 使用 InDesign SDK 我可以获取该颜色的 RGB 值 并在 CSS 文件中声明color rgb R G B 效
  • Visual Studio 2012 Web Essential 中缺少 Typescript 选项

    我正在设置 Visual Studio 2012 和 TypeScript 我遇到的问题是 网络要点Visual Studio 2012 gt 工具 gt 选项 gt Web Essentials gt TypeScript所有选项均丢失
  • 当字符串以 &*( 开头并以 )(* 结尾时,如何从字符串中删除一部分文本

    我有一根很长的绳子 字符串中的某个位置有一部分以 然后有一些文字 以 如何删除此文本以及开头和结尾的特殊符号 Example Bla bla bla asd asd asd bla bla bla Yadda yadda yadda akl
  • 将 CCAvenue 与 php 集成

    我是支付网关的新手 我想使用 PHP 将 CCAvenue 集成到我的网站 我已经下载了他们的集成工具包 包括我的商家 ID 和工作密钥 将帐户设置为活动状态 并尝试对他们在我的本地主机中提供的索引文件进行虚拟交易 但是 当我点击表单上的
  • 在新选项卡中打开 FPDF

    我有一个从帖子表单生成的 pdf fpdf 我希望 pdf 在新选项卡和 或窗口中打开 提示用户保存 pdf 我猜我需要将输出保存到字符串中 data pdf gt Output OfficeForm pdf S 但我到底可以用这个字符串做
  • JGit S3 仅支持标准美国存储桶?

    除了美国标准的 S3 存储桶之外 是否可以使用 JGit 的其他位置 即通过配置文件等 还是我在这里做错了什么 如果我尝试将位于 EU 的 S3 存储桶与 JGit 一起使用 jgit 会抛出错误 gt jgit push origin m
  • 在 API 23 / Marshmallow 中的 onOptionsItemSelected() 内的 recreate() 上出现错误

    我正在尝试使我的应用程序在 APIoptions menu 如果他们慢慢地点击菜单选项 这样就有时间看到该选项被突出显示 一切都很好 但如果他们短暂地点击 应用程序就会崩溃 我知道这是一种非常奇怪的行为 我花了一些时间试图理解是什么引发了错
  • cx_Freeze 复制路径

    我正在使用 cx Freeze 为我的 PyQt 应用程序生成 Windows 二进制文件 但生成的二进制安装程序似乎仍然包含对我的计算机上的文件的引用 生成二进制文件的那个 所以我无法将生成的安装程序分发到其他机器 当该程序在另一台计算机
  • tvOS 模拟器是否支持使用 Apple 登录 (SIWA)?

    我已在项目目标中启用 SIWA 的权利 相同的步骤在 iOS 模拟器中运行良好 我在 tvOS 模拟器上尝试使用 Apple SIWA 登录时遇到以下问题 重现问题的步骤 在点击自定义按钮请求 SIWA 时 全屏显示 Apple id 密码
  • 从用户位置查找数组中最接近的经度和纬度 - iOS Swift

    在发布的问题中here https stackoverflow com questions 24783442 find closest longitude and latitude in array from user location a
  • 如何复制 - 粘贴由 QStandardItemModel 创建的 QTableView 中的多个项目到文本/excel 文件?

    如何将 QTableView 的多个项目 值复制并粘贴到文本 Excel 文件 My Code tab table view QtGui QWidget self Tab insertTab 0 tab table view self Fi