QListWidget:currentRowChanged回滚
QListWidget: currentRowChanged rollback
def selected_radio_connection_changed(self,current_row):
self.current_row_new = self.main_self.ui_edit_radio_stations_window.stations_list.currentRow()
if(self.current_row_new!=self.current_row):
#ask for saving
box = QMessageBox()
box.setIcon(QMessageBox.Question)
box.setWindowTitle('Αποθήκευση αλλαγών')
box.setText('Θέλετε να αποθηκεύσετε τις αλλαγές σας;')
box.setStandardButtons(QMessageBox.Yes|QMessageBox.No|QMessageBox.Cancel)
buttonY = box.button(QMessageBox.Yes)
buttonY.setText('Ναι')
buttonN = box.button(QMessageBox.No)
buttonN.setText('Οχι')
buttonC = box.button(QMessageBox.Cancel)
buttonC.setText('Ακύρωση')
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/menu_window_icons/media/images/save.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
box.setWindowIcon(icon)
box.exec_()
if box.clickedButton() == buttonY:
self.save()
self.current_row = self.current_row_new
self.main_self.ui_edit_radio_stations_window.stations_list.setCurrentRow(self.current_row)
self.show_radio_connection_details()
elif box.clickedButton() == buttonN:
self.current_row = self.current_row_new
self.main_self.ui_edit_radio_stations_window.stations_list.setCurrentRow(self.current_row)
self.show_radio_connection_details()
elif box.clickedButton() == buttonC:
self.previous_item_timer=QTimer()
self.previous_item_timer.timeout.connect(self.return_to_previous_list_item)
self.previous_item_timer.setSingleShot(True)
self.previous_item_timer.start(100)
def return_to_previous_list_item(self):
self.main_self.ui_edit_radio_stations_window.stations_list.setCurrentRow(self.current_row)
self.current_row = self.main_self.ui_edit_radio_stations_window.stations_list.currentRow()
调用第一种方法:使用此命令:
self.main_self.ui_edit_radio_stations_window.stations_list.currentRowChanged.connect(lambda current_row:self.selected_radio_connection_changed(current_row))
其中 stations_list 是一个 QListWidget。
每次改变当前的qlist-item,都会打开一个QMessageBox提示。
使用前两个按钮似乎一切正常。
但是当点击第三个时,我想回滚到之前的 qlist-item。
问题是:为什么这个操作需要QTimer?
我想在selected_radio_connection_changed方法调用后有一个event.accept()。
问题源于您试图在 当前索引更改中“覆盖”当前索引。你应该更加小心,因为这样的交互可能会导致递归问题。
始终要考虑的一件重要事情是模型视图的当前索引并不总是与选择相匹配。
设置当前索引应该在“当前更改”结束时发生,因此您可以安全地使用 QTimer 或使用视图的选择模型selectionChanged
信号相反。
很遗憾,您提供的不够清楚MRE,所以很难给您一个更具体的解决方案,这取决于您的需求以及您如何实施整个过程。
def selected_radio_connection_changed(self,current_row):
self.current_row_new = self.main_self.ui_edit_radio_stations_window.stations_list.currentRow()
if(self.current_row_new!=self.current_row):
#ask for saving
box = QMessageBox()
box.setIcon(QMessageBox.Question)
box.setWindowTitle('Αποθήκευση αλλαγών')
box.setText('Θέλετε να αποθηκεύσετε τις αλλαγές σας;')
box.setStandardButtons(QMessageBox.Yes|QMessageBox.No|QMessageBox.Cancel)
buttonY = box.button(QMessageBox.Yes)
buttonY.setText('Ναι')
buttonN = box.button(QMessageBox.No)
buttonN.setText('Οχι')
buttonC = box.button(QMessageBox.Cancel)
buttonC.setText('Ακύρωση')
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/menu_window_icons/media/images/save.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
box.setWindowIcon(icon)
box.exec_()
if box.clickedButton() == buttonY:
self.save()
self.current_row = self.current_row_new
self.main_self.ui_edit_radio_stations_window.stations_list.setCurrentRow(self.current_row)
self.show_radio_connection_details()
elif box.clickedButton() == buttonN:
self.current_row = self.current_row_new
self.main_self.ui_edit_radio_stations_window.stations_list.setCurrentRow(self.current_row)
self.show_radio_connection_details()
elif box.clickedButton() == buttonC:
self.previous_item_timer=QTimer()
self.previous_item_timer.timeout.connect(self.return_to_previous_list_item)
self.previous_item_timer.setSingleShot(True)
self.previous_item_timer.start(100)
def return_to_previous_list_item(self):
self.main_self.ui_edit_radio_stations_window.stations_list.setCurrentRow(self.current_row)
self.current_row = self.main_self.ui_edit_radio_stations_window.stations_list.currentRow()
调用第一种方法:使用此命令:
self.main_self.ui_edit_radio_stations_window.stations_list.currentRowChanged.connect(lambda current_row:self.selected_radio_connection_changed(current_row))
其中 stations_list 是一个 QListWidget。
每次改变当前的qlist-item,都会打开一个QMessageBox提示。
使用前两个按钮似乎一切正常。 但是当点击第三个时,我想回滚到之前的 qlist-item。
问题是:为什么这个操作需要QTimer?
我想在selected_radio_connection_changed方法调用后有一个event.accept()。
问题源于您试图在 当前索引更改中“覆盖”当前索引。你应该更加小心,因为这样的交互可能会导致递归问题。
始终要考虑的一件重要事情是模型视图的当前索引并不总是与选择相匹配。
设置当前索引应该在“当前更改”结束时发生,因此您可以安全地使用 QTimer 或使用视图的选择模型selectionChanged
信号相反。
很遗憾,您提供的不够清楚MRE,所以很难给您一个更具体的解决方案,这取决于您的需求以及您如何实施整个过程。