Я пытаюсь добавить функцию копирования в буфер обмена в мой виджет PyQt5.В backend_qt5 я вижу класс NavigationToolbar2QT, а также класс ToolCopyToClipboardQT.Мой вопрос заключается в том, как реализовать этот класс в NavigationToolbar с помощью кнопки и ярлыка «STRG + C»?
Я не уверен, где я нашел пример исходного кода, я думаю, что он здесь на stackoverflow.Я также нашел на сайте matplotlibs пример использования менеджера инструментов для изменения панели навигации, но я не понимаю, как его использовать.Я использую Python3.7 и QT5
Я надеюсь, что кто-то может мне помочь.
Заранее спасибо,
Томас
import sys
from PyQt5 import QtWidgets
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
# How to implement the following ToolCopyToClipboardQT?
#from matplotlib.backends.backend_qt5 import ToolCopyToClipboardQT
#matplotlib.rcParams['toolbar'] = 'toolmanager'
# i've found addcopyfighandler, but this seems only to work under windows
#import addcopyfighandler
class PlotFigure(QtWidgets.QDialog):
def __init__(self, title, data, parent=None):
super(PlotFigure, self).__init__(parent)
# a figure instance to plot on
self.figure = Figure()
# this is the Canvas Widget that displays the `figure`
# it takes the `figure` instance as a parameter to __init__
self.canvas = FigureCanvas(self.figure)
#self.figure.canvas.manager.toolmanager.add_tool('Copy', ToolCopyToClipboardQT )
# this is the Navigation widget
# it takes the Canvas widget and a parent
self.toolbar = NavigationToolbar(self.canvas, self)
# Just some button connected to `plot` method
if __name__ == '__main__':
self.button = QtWidgets.QPushButton('Plot')
self.button.clicked.connect(self.plot)
self.copybutton = QtWidgets.QPushButton('Copy')
self.copybutton.clicked.connect(self.copy)
# set the layout
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
if __name__ == '__main__':
layout.addWidget(self.button)
layout.addWidget(self.copybutton)
self.setLayout(layout)
self.title = title
self.data = data
# Hmm is this the correct way?
self.qApp = QtWidgets.QApplication
def savefig(self, filename, **kwargs):
self.figure.savefig(filename, **kwargs)
# To get the copy to clipboard functionality I generate a button on the widget
# Actually, I do not want to add it to my widget, but in the Navigator Toolbar
def copy(self):
pixmap = self.canvas.grab()
self.qApp.clipboard().setPixmap(pixmap)
def plot(self):
''' plot the stuff '''
self.data['df'].plot(ax=self.figure.gca(), x = self.data['x'], title=self.title)
# refresh canvas
self.canvas.draw()
if __name__ == '__main__':
from random import randrange
import pandas as pd
numdata = 100
start = 35
# Some demo data
pltdata = {}
pltdata['x']='Time'
pltdata['df'] = pd.DataFrame(dict(
Time=[i * 0.00710324483775811209 for i in range(start, numdata + start)],
Fa=[randrange(-1000, 1000) for _ in range(numdata)],
Fb=[randrange(-500, 500) for _ in range(numdata)],
Fx=[randrange(-100, 100) for _ in range(numdata)],
Fy=[randrange(-50, 50) for _ in range(numdata)],
Fz=[randrange(-10, 10) for _ in range(numdata)],
))
app = QtWidgets.QApplication(sys.argv)
main = PlotFigure("Demo plot", pltdata)
main.show()
sys.exit(app.exec_())