2014-02-10 85 views
0

我需要在python中實現一個函數,它在按下「ctrl + v」時處理「粘貼」。我有一個QTableView,我需要複製表的一個字段並將其粘貼到表的另一個字段。我已經嘗試了下面的代碼,但問題是我不知道如何在tableView中讀取複製的項目(來自剪貼板)。 (因爲它已經複製了字段,我可以將它粘貼到其他任何地方,比如記事本)。這是我所試過的部分代碼:粘貼在QTableView的字段

class Widget(QWidget): 
def __init__(self,md,parent=None): 
    QWidget.__init__(self,parent) 
    # initially construct the visible table 
    self.tv=QTableView() 
    self.tv.show() 

    # set the shortcut ctrl+v for paste 
    QShortcut(QKeySequence('Ctrl+v'),self).activated.connect(self._handlePaste) 

    self.layout = QVBoxLayout(self) 
    self.layout.addWidget(self.tv) 

# paste the value 
def _handlePaste(self): 
    if self.tv.copiedItem.isEmpty(): 
     return 
    stream = QDataStream(self.tv.copiedItem, QIODevice.ReadOnly) 
    self.tv.readItemFromStream(stream, self.pasteOffset) 

回答

2

您可以獲取剪貼板形成用QApplication.clipboard()您的應用程序的QApplication實例,從QClipboard對象返回,你可以得到文字,aimge,MIME數據,等這裏有一個例子:

import PyQt4.QtGui as gui 

class Widget(gui.QWidget): 
    def __init__(self,parent=None): 
     gui.QWidget.__init__(self,parent) 
     # initially construct the visible table 
     self.tv=gui.QTableWidget() 
     self.tv.setRowCount(1) 
     self.tv.setColumnCount(1) 
     self.tv.show() 

     # set the shortcut ctrl+v for paste 
     gui.QShortcut(gui.QKeySequence('Ctrl+v'),self).activated.connect(self._handlePaste) 

     self.layout = gui.QVBoxLayout(self) 
     self.layout.addWidget(self.tv) 



    # paste the value 
    def _handlePaste(self): 
     clipboard_text = gui.QApplication.instance().clipboard().text() 
     item = gui.QTableWidgetItem() 
     item.setText(clipboard_text) 
     self.tv.setItem(0, 0, item) 
     print clipboard_text 



app = gui.QApplication([]) 

w = Widget() 
w.show() 

app.exec_() 

注:我已經使用了QTableWidget因爲我沒有一個模型QTableView使用,但您可以調整例如您的需求。

+0

AttributeError:'QTableView'對象沒有屬性'setItem' –

+1

你讀過最後的筆記嗎?我用'QTableWidget'而不是'QTableView'也檢查代碼;) –

+0

爲什麼這不是公認的答案? – pbreach