尝试使用按钮

时间:2017-12-01 07:01:01

标签: python multithreading pyqt signals clipboard

我正在试图找到一种方法来制作一个像样的复制到剪贴板按钮功能,我可以从QTextEdit小部件中的其他线程复制文本值。
我从其他线程中提取值并在QTextEdit小部件中显示它们并且一直尝试使用按钮成功地将QTextEdit的内容复制到剪贴板,但我能够的唯一方法是下面的代码。
我不喜欢的是复制按钮进行第二次调用以复制内容  是否有某种方法可以使用get_button按钮从第一个请求中存储值,并且可以使用复制按钮进行复制,而无需再次进行相同的调用?感谢。

from PyQt4 import QtCore, QtGui
import sys

class WorkerThread(QtCore.QThread):
    get_String = QtCore.pyqtSignal(str)

    def __init__(self):
        super(WorkerThread, self).__init__()

    def run(self):
        self.get_String.emit('Some text.')

class GUI(QtGui.QWidget):
    def __init__(self):
        super(GUI, self).__init__()
        self.get_Button = QtGui.QPushButton('Get')
        self.c_Button = QtGui.QPushButton('Copy')
        self.text_Box = QtGui.QTextEdit(self)
        vbox = QtGui.QVBoxLayout(self)
        vbox.addWidget(self.get_Button)
        vbox.addWidget(self.c_Button)
        vbox.addWidget(self.text_Box)
        vbox.addStretch()
        self.setGeometry(300, 300, 300, 300)
        self.show()

        self._thread = WorkerThread()
        self.get_Button.clicked.connect(self.doIt)
        self._thread.get_String.connect(self.text_Box.append)
        self.c_Button.clicked.connect(self.copy_Stuff)

    def copy_Stuff(self):
        self.clipboard = QtGui.QApplication.clipboard()
        self._thread.get_String.connect(self.clipboard.setText)
        self._thread.start()

    def doIt(self):
        self.text_Box.clear()
        self.text_Box.setText('')
        self._thread.start()

def main():
    app = QtGui.QApplication(sys.argv)
    gui = GUI()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

事实证明,这比我最初想的要容易得多。由于我在其他示例和帖子中看到的所有不同方式,我对如何正确复制文本感到困惑。在阅读了一段时间的文档并尝试学习更多关于pyqt后,我发现它就像使用这两行一样简单......

    self.text_Box.selectAll()
    self.text_Box.copy()

使用这两行和我的按钮似乎复制了QTextEdit小部件的所有内容,这是我真正需要的。这是我的最终工作代码,以防其他人发现它有用。

from PyQt4 import QtCore, QtGui
import sys

class WorkerThread(QtCore.QThread):
    get_String = QtCore.pyqtSignal(str)

    def __init__(self):
        super(WorkerThread, self).__init__()

    def run(self):
        self.get_String.emit('Some text.')

class GUI(QtGui.QWidget):
    def __init__(self):
        super(GUI, self).__init__()
        self.get_Button = QtGui.QPushButton('Get')
        self.c_Button = QtGui.QPushButton('Copy')
        self.text_Box = QtGui.QTextEdit(self)
        vbox = QtGui.QVBoxLayout(self)
        vbox.addWidget(self.get_Button)
        vbox.addWidget(self.c_Button)
        vbox.addWidget(self.text_Box)
        vbox.addStretch()
        self.setGeometry(300, 300, 300, 300)
        self.show()

        self._thread = WorkerThread()
        self.get_Button.clicked.connect(self.doIt)
        self._thread.get_String.connect(self.text_Box.append)
        self.c_Button.clicked.connect(self.copy_Stuff)

    def copy_Stuff(self):
        self.text_Box.selectAll()
        self.text_Box.copy()

    def doIt(self):
        self.text_Box.clear()
        self.text_Box.setText('')
        self._thread.start()

def main():
    app = QtGui.QApplication(sys.argv)
    gui = GUI()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

此代码示例显示了一个带有signal的简单工作线程,该函数向main返回一个值,在QTextEdit小部件中显示该值以及如何通过单击按钮复制QTextEdit小部件的所有内容。