Skip to content

Commit 1cc7df1

Browse files
committed
Bump from PyQt5 to PyQt6
1 parent 532bfeb commit 1cc7df1

24 files changed

Lines changed: 338 additions & 329 deletions

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,11 @@ To run, the following libraries and their dependencies will be installed:
8686

8787
Library | version | link
8888
------------------|-------------------|-------------------
89-
PyQT5 | >= 5.6.0 | https://pyqt.sourceforge.net/
90-
numpy | >= 1.13 | https://www.numpy.org
91-
cv2 (OpenCV3) | >= 3.1.0 | https://opencv.org
89+
PyQt6 | >= 6.9.1 | https://pyqt.sourceforge.net/
90+
numpy | >= 2.0.2 | https://www.numpy.org
91+
cv2 (OpenCV3) | >= 4.12.0 | https://opencv.org
9292
sqlite3 | >= 2.6.0 | https://www.sqlite.org
93-
openslide | >= 1.1.1 | https://www.openslide.org
93+
openslide | >= 1.4.2 | https://www.openslide.org
9494

9595
## Screenshots
9696

SlideRunner/SlideRunner.py

Lines changed: 77 additions & 67 deletions
Large diffs are not rendered by default.

SlideRunner/__main__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import rollbar
22
import multiprocessing
33
from SlideRunner_dataAccess.slide import SlideReader
4-
import PyQt5
5-
from PyQt5 import QtWidgets
4+
import PyQt6
5+
from PyQt6 import QtWidgets
66
from SlideRunner.gui import splashScreen
77
import sys
88

SlideRunner/general/dependencies.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
Bildverarbeitung fuer die Medizin 2018, Springer Verlag, Berlin-Heidelberg
1414
1515
"""
16-
from PyQt5 import QtWidgets
16+
from PyQt6 import QtWidgets
1717
import re
18+
import functools
19+
import os
1820

1921
def numeric(text) -> str:
2022
"""
@@ -47,14 +49,14 @@ def check_qt_dependencies():
4749
import sys
4850

4951
try:
50-
__import__('PyQt5')
52+
__import__('PyQt6')
5153
except:
52-
print('Error: PyQT5 not found. Please install.')
54+
print('Error: PyQt6 not found. Please install.')
5355
sys.exit(1)
5456
else:
55-
from PyQt5.QtCore import QT_VERSION_STR
57+
from PyQt6.QtCore import QT_VERSION_STR
5658
if not (check_version(QT_VERSION_STR, '5.6.0')):
57-
print('Your PyQT5 is too old (%s). Please upgrade to >= 5.6.0.' % QT_VERSION_STR)
59+
print('Your PyQt6 is too old (%s). Please upgrade to >= 5.6.0.' % QT_VERSION_STR)
5860
sys.exit(1)
5961

6062
def check_all_dependencies():
@@ -92,7 +94,7 @@ def check_all_dependencies():
9294
(hasattr(lib,'version') and type(lib.version)==str and not check_version(lib.version,version))):
9395

9496
reply = QtWidgets.QMessageBox.information(None, 'Error',
95-
'Too old package %s: Version should be at least %s' % (name, version), QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
97+
'Too old package %s: Version should be at least %s' % (name, version), QtWidgets.QMessageBox.StandardButton.Ok, QtWidgets.QMessageBox.StandardButton.Ok)
9698

9799

98100
import sys
@@ -103,11 +105,11 @@ def check_all_dependencies():
103105

104106
# The rest should now load fine
105107

106-
# More PyQt5 imports
107-
from PyQt5.QtCore import QThread, QStringListModel, Qt, pyqtSignal
108-
from PyQt5.QtGui import QPixmap, QColor, QImage, QStandardItemModel, QStandardItem, QBrush, QIcon, QKeySequence
109-
#from PyQt5.QtWidgets import *
110-
from PyQt5.QtWidgets import QDialog, QWidget, QFileDialog, QMenu,QInputDialog, QAction, QPushButton, QItemDelegate, QTableWidgetItem, QCheckBox
108+
# More PyQt6 imports
109+
from PyQt6.QtCore import QThread, QStringListModel, Qt, pyqtSignal
110+
from PyQt6.QtGui import QPixmap, QColor, QImage, QStandardItemModel, QStandardItem, QBrush, QIcon, QKeySequence, QAction
111+
#from PyQt6.QtWidgets import *
112+
from PyQt6.QtWidgets import QDialog, QWidget, QFileDialog, QMenu,QInputDialog, QPushButton, QItemDelegate, QTableWidgetItem, QCheckBox
111113

112114
# internal imports
113115
from SlideRunner.gui.SlideRunner_ui import Ui_MainWindow
@@ -131,4 +133,4 @@ def check_all_dependencies():
131133

132134
import matplotlib.cm
133135
partial = functools.partial
134-
path = path.path
136+
path = os.path

SlideRunner/gui/SlideRunner_ui.py

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,27 @@
22

33
# Form implementation generated from reading ui file 'SlideRunner_ui.ui'
44
#
5-
# Created by: PyQt5 UI code generator 5.10
5+
# Created by: PyQt6 UI code generator 5.10
66
#
77
# WARNING! All changes made in this file will be lost!
88

9-
from PyQt5 import QtCore, QtGui, QtWidgets
9+
from PyQt6 import QtCore, QtGui, QtWidgets
1010
from SlideRunner.gui.zoomSlider import *
1111
from SlideRunner.gui.frameSlider import *
1212

1313
class Ui_MainWindow(object):
1414
def setupUi(self, MainWindow):
1515
MainWindow.setObjectName("MainWindow")
16-
MainWindow.setWindowModality(QtCore.Qt.NonModal)
16+
MainWindow.setWindowModality(QtCore.Qt.WindowModality.NonModal)
1717
MainWindow.resize(905, 821)
18-
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
18+
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
1919
sizePolicy.setHorizontalStretch(0)
2020
sizePolicy.setVerticalStretch(0)
2121
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
2222
MainWindow.setSizePolicy(sizePolicy)
23-
MainWindow.setFocusPolicy(QtCore.Qt.StrongFocus)
23+
MainWindow.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
2424
MainWindow.setAcceptDrops(True)
25-
MainWindow.setDockOptions(QtWidgets.QMainWindow.AllowNestedDocks|QtWidgets.QMainWindow.AllowTabbedDocks|QtWidgets.QMainWindow.AnimatedDocks)
25+
MainWindow.setDockOptions(QtWidgets.QMainWindow.DockOption.AllowNestedDocks|QtWidgets.QMainWindow.DockOption.AllowTabbedDocks|QtWidgets.QMainWindow.DockOption.AnimatedDocks)
2626
MainWindow.setUnifiedTitleAndToolBarOnMac(True)
2727
self.centralwidget = QtWidgets.QWidget(MainWindow)
2828
self.centralwidget.setObjectName("centralwidget")
@@ -33,17 +33,17 @@ def setupUi(self, MainWindow):
3333
self.verticalLayout = QtWidgets.QVBoxLayout()
3434
self.verticalLayout.setObjectName("verticalLayout")
3535
self.MainImage = QtWidgets.QLabel(self.centralwidget)
36-
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored)
36+
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Ignored, QtWidgets.QSizePolicy.Policy.Ignored)
3737
sizePolicy.setHorizontalStretch(0)
3838
sizePolicy.setVerticalStretch(0)
3939
sizePolicy.setHeightForWidth(self.MainImage.sizePolicy().hasHeightForWidth())
4040
self.MainImage.setSizePolicy(sizePolicy)
4141
self.MainImage.setMinimumSize(QtCore.QSize(400, 400))
4242
self.MainImage.setLineWidth(0)
43-
self.MainImage.setAlignment(QtCore.Qt.AlignCenter)
43+
self.MainImage.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
4444
self.MainImage.setObjectName("MainImage")
4545
self.frameSlider = frameSlider()
46-
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Maximum)
46+
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Maximum)
4747
sizePolicy.setHorizontalStretch(0)
4848
sizePolicy.setVerticalStretch(0)
4949
sizePolicy.setHeightForWidth(self.frameSlider.sizePolicy().hasHeightForWidth())
@@ -52,13 +52,13 @@ def setupUi(self, MainWindow):
5252
self.verticalLayout.addWidget(self.MainImage)
5353
self.horizontalScrollBar = QtWidgets.QScrollBar(self.centralwidget)
5454
self.horizontalScrollBar.setMaximum(999)
55-
self.horizontalScrollBar.setOrientation(QtCore.Qt.Horizontal)
55+
self.horizontalScrollBar.setOrientation(QtCore.Qt.Orientation.Horizontal)
5656
self.horizontalScrollBar.setObjectName("horizontalScrollBar")
5757
self.verticalLayout.addWidget(self.horizontalScrollBar)
5858
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
5959
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
6060
self.zoomSlider = zoomSlider()
61-
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Maximum)
61+
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Maximum)
6262
sizePolicy.setHorizontalStretch(0)
6363
sizePolicy.setVerticalStretch(0)
6464
sizePolicy.setHeightForWidth(self.zoomSlider.sizePolicy().hasHeightForWidth())
@@ -68,22 +68,22 @@ def setupUi(self, MainWindow):
6868
self.verticalLayout.addLayout(self.horizontalLayout_2)
6969
self.horizontalLayout.addLayout(self.verticalLayout)
7070
self.verticalScrollBar = QtWidgets.QScrollBar(self.centralwidget)
71-
self.verticalScrollBar.setOrientation(QtCore.Qt.Vertical)
71+
self.verticalScrollBar.setOrientation(QtCore.Qt.Orientation.Vertical)
7272
self.verticalScrollBar.setObjectName("verticalScrollBar")
7373
self.horizontalLayout.addWidget(self.verticalScrollBar)
74-
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
74+
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
7575
self.horizontalLayout.addItem(spacerItem)
7676
self.sidebarLayout = QtWidgets.QVBoxLayout()
7777
self.sidebarLayout.setObjectName("sidebarLayout")
7878
self.OverviewLabel = QtWidgets.QLabel(self.centralwidget)
79-
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
79+
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
8080
sizePolicy.setHorizontalStretch(0)
8181
sizePolicy.setVerticalStretch(0)
8282
sizePolicy.setHeightForWidth(self.OverviewLabel.sizePolicy().hasHeightForWidth())
8383
self.OverviewLabel.setSizePolicy(sizePolicy)
8484
self.OverviewLabel.setMinimumSize(QtCore.QSize(200, 200))
85-
self.OverviewLabel.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
86-
self.OverviewLabel.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
85+
self.OverviewLabel.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor))
86+
self.OverviewLabel.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignTop)
8787
self.OverviewLabel.setObjectName("OverviewLabel")
8888
self.sidebarLayout.addWidget(self.OverviewLabel)
8989
self.filenameLabel = QtWidgets.QLabel(self.centralwidget)
@@ -110,27 +110,27 @@ def setupUi(self, MainWindow):
110110
self.statusbar = QtWidgets.QStatusBar(MainWindow)
111111
self.statusbar.setObjectName("statusbar")
112112
MainWindow.setStatusBar(self.statusbar)
113-
self.action_Open = QtWidgets.QAction(MainWindow)
113+
self.action_Open = QtGui.QAction(MainWindow)
114114
self.action_Open.setObjectName("action_Open")
115-
self.actionOpen = QtWidgets.QAction(MainWindow)
115+
self.actionOpen = QtGui.QAction(MainWindow)
116116
self.actionOpen.setObjectName("actionOpen")
117-
self.action_Close = QtWidgets.QAction(MainWindow)
117+
self.action_Close = QtGui.QAction(MainWindow)
118118
self.action_Close.setObjectName("action_Close")
119-
self.action_Quit = QtWidgets.QAction(MainWindow)
119+
self.action_Quit = QtGui.QAction(MainWindow)
120120
self.action_Quit.setObjectName("action_Quit")
121-
self.actionOpen_custom = QtWidgets.QAction(MainWindow)
121+
self.actionOpen_custom = QtGui.QAction(MainWindow)
122122
self.actionOpen_custom.setObjectName("actionOpen_custom")
123-
self.actionMode = QtWidgets.QAction(MainWindow)
123+
self.actionMode = QtGui.QAction(MainWindow)
124124
self.actionMode.setObjectName("actionMode")
125-
self.actionAdd_annotator = QtWidgets.QAction(MainWindow)
125+
self.actionAdd_annotator = QtGui.QAction(MainWindow)
126126
self.actionAdd_annotator.setEnabled(False)
127127
self.actionAdd_annotator.setObjectName("actionAdd_annotator")
128-
self.actionAdd_cell_class = QtWidgets.QAction(MainWindow)
128+
self.actionAdd_cell_class = QtGui.QAction(MainWindow)
129129
self.actionAdd_cell_class.setEnabled(False)
130130
self.actionAdd_cell_class.setObjectName("actionAdd_cell_class")
131-
self.actionCreate_new = QtWidgets.QAction(MainWindow)
131+
self.actionCreate_new = QtGui.QAction(MainWindow)
132132
self.actionCreate_new.setObjectName("actionCreate_new")
133-
self.actionAbout = QtWidgets.QAction(MainWindow)
133+
self.actionAbout = QtGui.QAction(MainWindow)
134134
self.actionAbout.setObjectName("actionAbout")
135135
self.menuDatabase.addAction(self.actionCreate_new)
136136
self.menuDatabase.addAction(self.action_Open)

SlideRunner/gui/annotation.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
import numpy as np
1818
from SlideRunner.gui import mouseEvents as mouseEvents
19-
from PyQt5 import QtWidgets
20-
from PyQt5.QtGui import QColor
19+
from PyQt6 import QtWidgets
20+
from PyQt6.QtGui import QColor
2121
from SlideRunner_dataAccess.database import hex_to_rgb, rgb_to_hex
2222
from shapely.geometry import *
2323

@@ -92,9 +92,9 @@ def changeClassColor(self,oldcolor, classID, event = None):
9292
def deleteClass(self, classID, event = None):
9393
text = self.db.getClassByID(classID)
9494
reply = QtWidgets.QMessageBox.question(self, 'Question',
95-
'Do you really wish to delete this class and all of its objects?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
95+
'Do you really wish to delete this class and all of its objects?', QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No)
9696

97-
if reply == QtWidgets.QMessageBox.No:
97+
if reply == QtWidgets.QMessageBox.StandardButton.No:
9898
return
9999

100100
self.db.deleteClass(classID)
@@ -124,9 +124,9 @@ def deleteAllFromClassOnSlide(self, classID, event = None):
124124
return
125125

126126
reply = QtWidgets.QMessageBox.question(self, 'Question',
127-
'Do you really wish to delete all objects of this class from the current slide?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
127+
'Do you really wish to delete all objects of this class from the current slide?', QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No)
128128

129-
if reply == QtWidgets.QMessageBox.No:
129+
if reply == QtWidgets.QMessageBox.StandardButton.No:
130130
return
131131

132132

@@ -150,9 +150,9 @@ def copyAllAnnotations(self, pluginAnnoClass, classID, event = None):
150150
annos = self.activePlugin.instance.getAnnotationsOfLabel(pluginAnnoClass)
151151

152152
reply = QtWidgets.QMessageBox.question(self, 'Question',
153-
'Do you really wish to copy %d annotation items of this class to the database?' % len(annos), QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
153+
'Do you really wish to copy %d annotation items of this class to the database?' % len(annos), QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No)
154154

155-
if reply == QtWidgets.QMessageBox.No:
155+
if reply == QtWidgets.QMessageBox.StandardButton.No:
156156
return
157157

158158
for pluginAnno in annos:

SlideRunner/gui/dialogs/about.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414
Springer Vieweg, Berlin, Heidelberg, 2018. pp. 309-314.
1515
"""
1616

17-
from PyQt5 import QtGui, QtWidgets, QtCore
17+
from PyQt6 import QtGui, QtWidgets, QtCore
1818
import sys
1919
from time import time,sleep
20-
from PyQt5.QtGui import QPixmap
21-
from PyQt5.QtWidgets import QDialog, QApplication, QMainWindow
22-
from PyQt5.QtWidgets import QSplashScreen
23-
from PyQt5.QtCore import Qt
20+
from PyQt6.QtGui import QPixmap
21+
from PyQt6.QtWidgets import QDialog, QApplication, QMainWindow
22+
from PyQt6.QtWidgets import QSplashScreen
23+
from PyQt6.QtCore import Qt
2424
from functools import partial
2525

2626
import os
@@ -34,9 +34,9 @@ def aboutDialog(app,version):
3434

3535
# Create and display the about screen
3636
splash_pix = QPixmap(ARTWORK_DIR_NAME+'AboutScreen.png')
37-
splash = QSplashScreen(splash_pix, Qt.WindowStaysOnTopHint)
37+
splash = QSplashScreen(splash_pix, Qt.WindowType.WindowStaysOnTopHint)
3838

39-
splash.showMessage('Version %s\n'%version, alignment = Qt.AlignHCenter + Qt.AlignBottom, color=Qt.black)
39+
splash.showMessage('Version %s\n'%version, alignment = Qt.AlignmentFlag.AlignHCenter + Qt.AlignmentFlag.AlignBottom, color=Qt.GlobalColor.black)
4040
splash.setMask(splash_pix.mask())
4141
splash.show()
4242

SlideRunner/gui/dialogs/dbmanager.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from SlideRunner.general.dependencies import *
22
from SlideRunner_dataAccess.database import Database
33
from functools import partial
4-
from PyQt5 import QtCore, QtGui, QtWidgets
5-
from PyQt5.QtCore import pyqtSlot
4+
from PyQt6 import QtCore, QtGui, QtWidgets
5+
from PyQt6.QtCore import pyqtSlot
66
import sys
77
import os
8-
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAction, QTableWidget,QTableWidgetItem,QVBoxLayout
9-
from PyQt5.QtGui import QIcon
8+
from PyQt6.QtWidgets import QMainWindow, QApplication, QWidget, QTableWidget,QTableWidgetItem,QVBoxLayout
9+
from PyQt6.QtGui import QIcon, QAction
1010

1111
class DatabaseManager(QDialog):
1212

@@ -60,7 +60,7 @@ def createTable(self):
6060
self.tableWidget.move(0,0)
6161
self.tableWidget.resizeColumnsToContents()
6262
self.tableWidget.viewport().installEventFilter(self)
63-
self.tableWidget.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
63+
self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
6464

6565
def loadFile(self, uid):
6666

@@ -75,9 +75,9 @@ def loadFile(self, uid):
7575

7676
def removeFile(self, uid):
7777
reply = QtWidgets.QMessageBox.question(self, 'Question',
78-
'Do you really want to delete the file and all annotations from the database?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
78+
'Do you really want to delete the file and all annotations from the database?', QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No)
7979

80-
if reply == QtWidgets.QMessageBox.No:
80+
if reply == QtWidgets.QMessageBox.StandardButton.No:
8181
return
8282
self.DB.removeFileFromDatabase(uid[0])
8383
self.DB.commit()
@@ -87,12 +87,12 @@ def removeFile(self, uid):
8787
def removeExactLink(self, uids:list):
8888
if (len(uids)>1):
8989
reply = QtWidgets.QMessageBox.question(self, 'Question',
90-
'Do you really want to remove the link to EXACT for these slides?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
90+
'Do you really want to remove the link to EXACT for these slides?', QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No)
9191
else:
9292
reply = QtWidgets.QMessageBox.question(self, 'Question',
93-
'Do you really want to remove the link to EXACT for this slide?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
93+
'Do you really want to remove the link to EXACT for this slide?', QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No)
9494

95-
if reply == QtWidgets.QMessageBox.No:
95+
if reply == QtWidgets.QMessageBox.StandardButton.No:
9696
return
9797
for uid in uids:
9898
self.DB.execute(f'UPDATE Slides SET exactImageID=Null where uid=={uid}')
@@ -101,8 +101,8 @@ def removeExactLink(self, uids:list):
101101
self.show()
102102

103103
def eventFilter(self, source, event):
104-
if(event.type() == QtCore.QEvent.MouseButtonPress and
105-
event.buttons() == QtCore.Qt.RightButton and
104+
if(event.type() == QtCore.QEvent.Type.MouseButtonPress and
105+
event.buttons() == QtCore.Qt.MouseButton.RightButton and
106106
source is self.tableWidget.viewport()):
107107
rows = np.unique([x.row() for x in self.tableWidget.selectedItems()])
108108
rowuids = [self.los[x][0] for x in rows]
@@ -115,7 +115,7 @@ def eventFilter(self, source, event):
115115
menu.addAction('Remove EXACT link selected rows ', partial(self.removeExactLink, rowuids)) #(QAction('test'))
116116
else:
117117
menu.addAction('Remove EXACT link for '+self.los[item.row()][1], partial(self.removeExactLink, rowuids)) #(QAction('test'))
118-
menu.exec_(event.globalPos())
118+
menu.exec(event.globalPos())
119119
return super(DatabaseManager, self).eventFilter(source, event)
120120

121121

0 commit comments

Comments
 (0)