[英]How to call QMainWindow class method from within extended QListWidget class dropEvent?
這是源代碼的一部分。 運行它時,只需將一個項目從第一個listWidget拖放到第二個listWidget。
我在dropEvent中有一條打印語句,在這里我想調用父QMainWindow的名為“ special”的方法。
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt,QString
import sys, os
class ThumbListWidget(QtGui.QListWidget):
_rows_to_del=[]
def __init__(self, type, parent=None):
super(ThumbListWidget, self).__init__(parent)
self.setIconSize(QtCore.QSize(124, 124))
self.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
self.setAcceptDrops(True)
self._dropping = False
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.accept()
else:
super(ThumbListWidget, self).dragEnterEvent(event)
def dragMoveEvent(self, event):
if event.mimeData().hasUrls():
event.setDropAction(QtCore.Qt.CopyAction)
event.accept()
else:
super(ThumbListWidget, self).dragMoveEvent(event)
def dropEvent(self, event):
print "How can I call the main window class method called 'special' here?"
if event.mimeData().hasUrls():
event.setDropAction(QtCore.Qt.CopyAction)
event.accept()
links = []
for url in event.mimeData().urls():
links.append(str(url.toLocalFile()))
self.emit(QtCore.SIGNAL("dropped"), links)
else:
event.setDropAction(QtCore.Qt.CopyAction)
self._dropping = True
super(ThumbListWidget, self).dropEvent(event)
self._dropping = False
def rowsInserted(self, parent, start, end):
if self._dropping:
self.emit(QtCore.SIGNAL("dropped"), (start, end))
super(ThumbListWidget, self).rowsInserted(parent, start, end)
def dataChanged(self,start,end):
if self._dropping:
for row in range(start.row(),end.row()+1):
index = self.indexFromItem(self.item(row))
shot = index.data().toString()
#print len(self.findItems(shot,Qt.MatchExactly))
if len(self.findItems(shot,Qt.MatchExactly))>1:
self._rows_to_del.append(row)
self._rows_to_del.reverse()
for row in self._rows_to_del:
self.takeItem(row)
self._rows_to_del=[]
class Dialog_01(QtGui.QMainWindow):
def __init__(self):
super(QtGui.QMainWindow,self).__init__()
self.listItems={}
myQWidget = QtGui.QWidget()
myBoxLayout = QtGui.QVBoxLayout()
myQWidget.setLayout(myBoxLayout)
self.setCentralWidget(myQWidget)
self.listWidgetA = ThumbListWidget(self)
for i in range(12):
QtGui.QListWidgetItem( 'Item '+str(i), self.listWidgetA )
all_items = self.listWidgetA.findItems(QString('*'), Qt.MatchWrap | Qt.MatchWildcard)
for item in all_items:
item.setFlags(item.flags() | Qt.ItemIsUserCheckable )
# item.setCheckState(Qt.Checked)
myBoxLayout.addWidget(self.listWidgetA)
self.listWidgetB = ThumbListWidget(self)
self.listWidgetA.setAcceptDrops(False)
myBoxLayout.addWidget(self.listWidgetB)
self.connect(self.listWidgetA, QtCore.SIGNAL("dropped"), self.items_dropped)
self.listWidgetA.currentItemChanged.connect(self.item_clicked)
self.connect(self.listWidgetB, QtCore.SIGNAL("dropped"), self.items_dropped)
self.listWidgetB.currentItemChanged.connect(self.item_clicked)
def items_dropped(self, arg):
print 'items_dropped', arg
start,end = arg
#print range(start,end+1)
for row in range(start,end+1):
item = self.listWidgetB.item(row)
item.setFlags(item.flags() | Qt.ItemIsUserCheckable )
item.setCheckState(Qt.Checked)
def special(self):
print "special called"
def item_clicked(self, arg):
print "arg=",arg
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
dialog_1 = Dialog_01()
dialog_1.show()
dialog_1.resize(480,320)
sys.exit(app.exec_())
在這種情況下,您會將窗口作為self
傳遞給自定義窗口小部件的構造函數,它將成為自定義窗口小部件的父級。 所以你應該能夠做
window = self.parent()
window.special()
您還可以使用Qt事件系統發出一個事件,您的主窗口可以連接到該事件並調用special
方法本身。
class ThumbListWidget(QtGui.QListWidget):
my_signal = pyqtSignal()
def dropEvent(self, event):
self.my_signal.emit()
class Dialog_01(QtGui.QMainWindow):
def __init__(self):
...
self.listWidgetB = ThumbListWidget(self)
self.listWidgetB.my_signal.connect(self.special)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.