From a4256d3d2b48327446f0d4f7f2bdd329ed9eb056 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 20 Oct 2013 15:15:09 -0400 Subject: [PATCH] First Qt5 conversion commit Replaced PyQt4 with PyQt5 and made all adjustments necessary to make dupeGuru start up. --- bootstrap.sh | 2 +- build.py | 4 ++-- hscommon/build.py | 4 ++-- hscommon/desktop.py | 10 +++++----- hscommon/trans.py | 4 ++-- qt/base/app.py | 7 ++++--- qt/base/deletion_options.py | 4 ++-- qt/base/details_dialog.py | 7 ++++--- qt/base/details_table.py | 10 +++++----- qt/base/directories_dialog.py | 13 +++++++------ qt/base/directories_model.py | 9 +++++---- qt/base/ignore_list_dialog.py | 4 ++-- qt/base/preferences.py | 2 +- qt/base/preferences_dialog.py | 8 ++++---- qt/base/prioritize_dialog.py | 4 ++-- qt/base/problem_dialog.py | 4 ++-- qt/base/result_window.py | 10 +++++----- qt/base/results_model.py | 5 +++-- qt/me/details_dialog.py | 4 ++-- qt/me/preferences_dialog.py | 4 ++-- qt/pe/app.py | 2 +- qt/pe/details_dialog.py | 4 ++-- qt/pe/preferences_dialog.py | 2 +- qt/pe/result_window.py | 2 +- qt/run_template.py | 5 +++-- qt/se/details_dialog.py | 6 +++--- qt/se/preferences_dialog.py | 4 ++-- qtlib/about_box.py | 7 ++++--- qtlib/app.py | 2 +- qtlib/column.py | 2 +- qtlib/error_report_dialog.py | 7 ++++--- qtlib/preferences.py | 4 +--- qtlib/progress_window.py | 4 ++-- qtlib/radio_box.py | 4 ++-- qtlib/recent.py | 4 ++-- qtlib/reg.py | 2 +- qtlib/reg_demo_dialog.py | 6 +++--- qtlib/reg_submit_dialog.py | 4 ++-- qtlib/search_edit.py | 8 ++++---- qtlib/selectable_list.py | 3 +-- qtlib/table.py | 6 +++--- qtlib/tree_model.py | 5 +++-- qtlib/util.py | 7 ++++--- 43 files changed, 113 insertions(+), 106 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 21c95b93..1ff59e2f 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -18,7 +18,7 @@ echo "Installing pip requirements" if [ "$(uname)" == "Darwin" ]; then pip install -r requirements-osx.txt else - python3 -c "import PyQt4" >/dev/null 2>&1 || { echo >&2 "PyQt 4.8+ required. Install it and try again. Aborting"; exit 1; } + python3 -c "import PyQt5" >/dev/null 2>&1 || { echo >&2 "PyQt 5.1+ required. Install it and try again. Aborting"; exit 1; } pip install -r requirements.txt fi diff --git a/build.py b/build.py index 5ae90608..8e315047 100644 --- a/build.py +++ b/build.py @@ -149,7 +149,7 @@ def build_qt(edition, dev, conf): print("Building localizations") build_localizations('qt', edition) print("Building Qt stuff") - print_and_do("pyrcc4 -py3 {0} > {1}".format(op.join('qt', 'base', 'dg.qrc'), op.join('qt', 'base', 'dg_rc.py'))) + print_and_do("pyrcc5 {0} > {1}".format(op.join('qt', 'base', 'dg.qrc'), op.join('qt', 'base', 'dg_rc.py'))) fix_qt_resource_file(op.join('qt', 'base', 'dg_rc.py')) print("Creating the run.py file") filereplace(op.join('qt', 'run_template.py'), 'run.py', edition=edition) @@ -191,7 +191,7 @@ def build_localizations(ui, edition): shutil.copytree('locale', locale_dest, ignore=shutil.ignore_patterns('*.po', '*.pot')) if ui == 'qt' and not ISLINUX: print("Copying qt_*.qm files into the 'locale' folder") - from PyQt4.QtCore import QLibraryInfo + from PyQt5.QtCore import QLibraryInfo trfolder = QLibraryInfo.location(QLibraryInfo.TranslationsPath) for lang in loc.get_langs('locale'): qmname = 'qt_%s.qm' % lang diff --git a/hscommon/build.py b/hscommon/build.py index dcd7ece0..c578190d 100644 --- a/hscommon/build.py +++ b/hscommon/build.py @@ -196,7 +196,7 @@ def copy_packages(packages_names, dest, create_links=False, extra_ignores=None): shutil.copy(source_path, dest_path) def copy_qt_plugins(folder_names, dest): # This is only for Windows - from PyQt4.QtCore import QLibraryInfo + from PyQt5.QtCore import QLibraryInfo qt_plugin_dir = QLibraryInfo.location(QLibraryInfo.PluginsPath) def ignore(path, names): if path == qt_plugin_dir: @@ -444,7 +444,7 @@ def collect_stdlib_dependencies(script, dest_folder, extra_deps=None): delete_files_with_pattern(op.join(dest_folder, 'distutils'), '*.exe') def fix_qt_resource_file(path): - # pyrcc4 under Windows, if the locale is non-english, can produce a source file with a date + # pyrcc5 under Windows, if the locale is non-english, can produce a source file with a date # containing accented characters. If it does, the encoding is wrong and it prevents the file # from being correctly frozen by cx_freeze. To work around that, we open the file, strip all # comments, and save. diff --git a/hscommon/desktop.py b/hscommon/desktop.py index ea5d707f..b2e89533 100644 --- a/hscommon/desktop.py +++ b/hscommon/desktop.py @@ -46,8 +46,8 @@ try: except ImportError: try: - from PyQt4.QtCore import QUrl - from PyQt4.QtGui import QDesktopServices + from PyQt5.QtCore import QUrl, QStandardPaths + from PyQt5.QtGui import QDesktopServices import os.path as op def _open_path(path): url = QUrl.fromLocalFile(str(path)) @@ -58,10 +58,10 @@ except ImportError: def _special_folder_path(special_folder): if special_folder == SpecialFolder.Cache: - qtfolder = QDesktopServices.CacheLocation + qtfolder = QStandardPaths.CacheLocation else: - qtfolder = QDesktopServices.DataLocation - return str(QDesktopServices.storageLocation(qtfolder)) + qtfolder = QStandardPaths.DataLocation + return QStandardPaths.standardLocations(qtfolder)[0] except ImportError: raise Exception("Can't setup desktop functions!") diff --git a/hscommon/trans.py b/hscommon/trans.py index 89ea67aa..a1106f73 100644 --- a/hscommon/trans.py +++ b/hscommon/trans.py @@ -59,7 +59,7 @@ def get_locale_name(lang): #--- Qt def install_qt_trans(lang=None): - from PyQt4.QtCore import QCoreApplication, QTranslator, QLocale + from PyQt5.QtCore import QCoreApplication, QTranslator, QLocale if not lang: lang = str(QLocale.system().name())[:2] localename = get_locale_name(lang) @@ -116,7 +116,7 @@ def install_gettext_trans_under_qt(base_folder, lang=None): # So, we install the gettext locale, great, but we also should try to install qt_*.qm if # available so that strings that are inside Qt itself over which I have no control are in the # right language. - from PyQt4.QtCore import QCoreApplication, QTranslator, QLocale, QLibraryInfo + from PyQt5.QtCore import QCoreApplication, QTranslator, QLocale, QLibraryInfo if not lang: lang = str(QLocale.system().name())[:2] localename = get_locale_name(lang) diff --git a/qt/base/app.py b/qt/base/app.py index f4d6b378..65125353 100644 --- a/qt/base/app.py +++ b/qt/base/app.py @@ -9,8 +9,9 @@ import sys import os.path as op -from PyQt4.QtCore import QTimer, QObject, QCoreApplication, QUrl, QProcess, SIGNAL, pyqtSignal -from PyQt4.QtGui import QDesktopServices, QFileDialog, QDialog, QMessageBox, QApplication +from PyQt5.QtCore import QTimer, QObject, QCoreApplication, QUrl, QProcess, pyqtSignal +from PyQt5.QtGui import QDesktopServices +from PyQt5.QtWidgets import QApplication, QFileDialog, QDialog, QMessageBox from hscommon.trans import trget from hscommon.plat import ISLINUX @@ -74,7 +75,7 @@ class DupeGuru(QObject): # In some circumstances, the nag is hidden by other window, which may make the user think # that the application haven't launched. QTimer.singleShot(0, self.finishedLaunching) - self.connect(QCoreApplication.instance(), SIGNAL('aboutToQuit()'), self.application_will_terminate) + QCoreApplication.instance().aboutToQuit.connect(self.application_will_terminate) def _setupActions(self): # Setup actions that are common to both the directory dialog and the results window. diff --git a/qt/base/deletion_options.py b/qt/base/deletion_options.py index e42234d1..53bd916f 100644 --- a/qt/base/deletion_options.py +++ b/qt/base/deletion_options.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt -from PyQt4.QtGui import QDialog, QVBoxLayout, QLabel, QCheckBox, QDialogButtonBox +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QCheckBox, QDialogButtonBox from hscommon.trans import trget from qtlib.radio_box import RadioBox diff --git a/qt/base/details_dialog.py b/qt/base/details_dialog.py index e7f6d9d5..a156c46d 100644 --- a/qt/base/details_dialog.py +++ b/qt/base/details_dialog.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt -from PyQt4.QtGui import QDialog +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QDialog from .details_table import DetailsModel @@ -42,5 +42,6 @@ class DetailsDialog(QDialog): #--- model --> view def refresh(self): - self.tableModel.reset() + self.tableModel.beginResetModel() + self.tableModel.endResetModel() diff --git a/qt/base/details_table.py b/qt/base/details_table.py index 91a810a7..884fbedc 100644 --- a/qt/base/details_table.py +++ b/qt/base/details_table.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt, SIGNAL, QAbstractTableModel -from PyQt4.QtGui import QHeaderView, QTableView +from PyQt5.QtCore import Qt, QAbstractTableModel +from PyQt5.QtWidgets import QHeaderView, QTableView from hscommon.trans import trget @@ -55,9 +55,9 @@ class DetailsTable(QTableView): hheader.setHighlightSections(False) hheader.setStretchLastSection(False) hheader.resizeSection(0, 100) - hheader.setResizeMode(0, QHeaderView.Fixed) - hheader.setResizeMode(1, QHeaderView.Stretch) - hheader.setResizeMode(2, QHeaderView.Stretch) + hheader.setSectionResizeMode(0, QHeaderView.Fixed) + hheader.setSectionResizeMode(1, QHeaderView.Stretch) + hheader.setSectionResizeMode(2, QHeaderView.Stretch) vheader = self.verticalHeader() vheader.setVisible(False) vheader.setDefaultSectionSize(18) diff --git a/qt/base/directories_dialog.py b/qt/base/directories_dialog.py index 3e4ea3ba..b076ce69 100644 --- a/qt/base/directories_dialog.py +++ b/qt/base/directories_dialog.py @@ -6,10 +6,11 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import QRect -from PyQt4.QtGui import (QWidget, QFileDialog, QHeaderView, QVBoxLayout, QHBoxLayout, QTreeView, - QAbstractItemView, QSpacerItem, QSizePolicy, QPushButton, QApplication, QMainWindow, QMenuBar, - QMenu, QIcon, QPixmap, QLabel) +from PyQt5.QtCore import QRect +from PyQt5.QtWidgets import (QWidget, QFileDialog, QHeaderView, QVBoxLayout, QHBoxLayout, QTreeView, + QAbstractItemView, QSpacerItem, QSizePolicy, QPushButton, QMainWindow, QMenuBar, QMenu, QLabel, + QApplication) +from PyQt5.QtGui import QPixmap, QIcon from hscommon.trans import trget from qtlib.recent import Recent @@ -149,8 +150,8 @@ class DirectoriesDialog(QMainWindow): def _setupColumns(self): header = self.treeView.header() header.setStretchLastSection(False) - header.setResizeMode(0, QHeaderView.Stretch) - header.setResizeMode(1, QHeaderView.Fixed) + header.setSectionResizeMode(0, QHeaderView.Stretch) + header.setSectionResizeMode(1, QHeaderView.Fixed) header.resizeSection(1, 100) def _updateAddButton(self): diff --git a/qt/base/directories_model.py b/qt/base/directories_model.py index 7df5b70c..8cf9272b 100644 --- a/qt/base/directories_model.py +++ b/qt/base/directories_model.py @@ -8,9 +8,10 @@ import urllib.parse -from PyQt4.QtCore import pyqtSignal, Qt, QRect, QUrl, QModelIndex -from PyQt4.QtGui import (QComboBox, QStyledItemDelegate, QApplication, QBrush, QStyle, - QStyleOptionComboBox, QStyleOptionViewItemV4, QItemSelection) +from PyQt5.QtCore import pyqtSignal, Qt, QRect, QUrl, QModelIndex, QItemSelection +from PyQt5.QtWidgets import (QComboBox, QStyledItemDelegate, QStyle, QStyleOptionComboBox, + QStyleOptionViewItem, QApplication) +from PyQt5.QtGui import QBrush from hscommon.trans import trget from qtlib.tree_model import RefNode, TreeModel @@ -29,7 +30,7 @@ class DirectoriesDelegate(QStyledItemDelegate): def paint(self, painter, option, index): self.initStyleOption(option, index) # No idea why, but this cast is required if we want to have access to the V4 valuess - option = QStyleOptionViewItemV4(option) + option = QStyleOptionViewItem(option) if (index.column() == 1) and (option.state & QStyle.State_Selected): cboption = QStyleOptionComboBox() cboption.rect = option.rect diff --git a/qt/base/ignore_list_dialog.py b/qt/base/ignore_list_dialog.py index 169592df..9777c0d0 100644 --- a/qt/base/ignore_list_dialog.py +++ b/qt/base/ignore_list_dialog.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt -from PyQt4.QtGui import QDialog, QVBoxLayout, QPushButton, QTableView, QAbstractItemView +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QDialog, QVBoxLayout, QPushButton, QTableView, QAbstractItemView from hscommon.trans import trget from qtlib.util import horizontalWrap diff --git a/qt/base/preferences.py b/qt/base/preferences.py index 2eabd6b2..bfb592d6 100644 --- a/qt/base/preferences.py +++ b/qt/base/preferences.py @@ -6,7 +6,7 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtGui import QApplication +from PyQt5.QtWidgets import QApplication from hscommon import trans from qtlib.preferences import Preferences as PreferencesBase diff --git a/qt/base/preferences_dialog.py b/qt/base/preferences_dialog.py index edbed81b..2b5c10d4 100644 --- a/qt/base/preferences_dialog.py +++ b/qt/base/preferences_dialog.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import SIGNAL, Qt, QSize -from PyQt4.QtGui import (QDialog, QDialogButtonBox, QVBoxLayout, QHBoxLayout, QLabel, QComboBox, +from PyQt5.QtCore import Qt, QSize +from PyQt5.QtWidgets import (QDialog, QDialogButtonBox, QVBoxLayout, QHBoxLayout, QLabel, QComboBox, QSlider, QSizePolicy, QSpacerItem, QCheckBox, QLineEdit, QMessageBox, QSpinBox) from hscommon.plat import ISOSX, ISLINUX @@ -26,8 +26,8 @@ class PreferencesDialogBase(QDialog): self.app = app self._setupUi() - self.connect(self.filterHardnessSlider, SIGNAL("valueChanged(int)"), self.filterHardnessLabel.setNum) - self.connect(self.buttonBox, SIGNAL('clicked(QAbstractButton*)'), self.buttonClicked) + self.filterHardnessSlider.valueChanged['int'].connect(self.filterHardnessLabel.setNum) + self.buttonBox.clicked['QAbstractButton*'].connect(self.buttonClicked) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) diff --git a/qt/base/prioritize_dialog.py b/qt/base/prioritize_dialog.py index 88920762..73d5cc52 100644 --- a/qt/base/prioritize_dialog.py +++ b/qt/base/prioritize_dialog.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt, QMimeData, QByteArray -from PyQt4.QtGui import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox, QListView, +from PyQt5.QtCore import Qt, QMimeData, QByteArray +from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox, QListView, QDialogButtonBox, QAbstractItemView, QLabel, QStyle, QSplitter, QWidget, QSizePolicy) from hscommon.trans import trget diff --git a/qt/base/problem_dialog.py b/qt/base/problem_dialog.py index 7c77091a..4310da1c 100644 --- a/qt/base/problem_dialog.py +++ b/qt/base/problem_dialog.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt -from PyQt4.QtGui import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QSpacerItem, QSizePolicy, +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QSpacerItem, QSizePolicy, QLabel, QTableView, QAbstractItemView, QApplication) from hscommon.trans import trget diff --git a/qt/base/result_window.py b/qt/base/result_window.py index 1ee10b25..bb6438e4 100644 --- a/qt/base/result_window.py +++ b/qt/base/result_window.py @@ -6,9 +6,9 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt, QUrl, QRect -from PyQt4.QtGui import (QMainWindow, QMenu, QLabel, QDesktopServices, QFileDialog, QMenuBar, - QWidget, QVBoxLayout, QAbstractItemView, QStatusBar, QDialog, QAction, QPushButton, QCheckBox) +from PyQt5.QtCore import Qt, QRect +from PyQt5.QtWidgets import (QMainWindow, QMenu, QLabel, QFileDialog, QMenuBar, QWidget, + QVBoxLayout, QAbstractItemView, QStatusBar, QDialog, QAction, QPushButton, QCheckBox) from hscommon.trans import trget from qtlib.util import moveToScreenCenter, horizontalWrap, createActions @@ -164,7 +164,7 @@ class ResultWindow(QMainWindow): self.resize(630, 514) self.centralwidget = QWidget(self) self.verticalLayout = QVBoxLayout(self.centralwidget) - self.verticalLayout.setMargin(0) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.actionsButton = QPushButton(tr("Actions")) self.detailsButton = QPushButton(tr("Details")) @@ -183,7 +183,7 @@ class ResultWindow(QMainWindow): self.resultsView.verticalHeader().setVisible(False) h = self.resultsView.horizontalHeader() h.setHighlightSections(False) - h.setMovable(True) + h.setSectionsMovable(True) h.setStretchLastSection(False) h.setDefaultAlignment(Qt.AlignLeft) self.verticalLayout.addWidget(self.resultsView) diff --git a/qt/base/results_model.py b/qt/base/results_model.py index 24380853..601fc50a 100644 --- a/qt/base/results_model.py +++ b/qt/base/results_model.py @@ -6,8 +6,9 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt, pyqtSignal -from PyQt4.QtGui import QBrush, QFont, QFontMetrics, QTableView, QColor +from PyQt5.QtCore import Qt, pyqtSignal +from PyQt5.QtGui import QBrush, QFont, QFontMetrics, QColor +from PyQt5.QtWidgets import QTableView from qtlib.table import Table diff --git a/qt/me/details_dialog.py b/qt/me/details_dialog.py index 5c2e3b66..a754d3e9 100644 --- a/qt/me/details_dialog.py +++ b/qt/me/details_dialog.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import QSize -from PyQt4.QtGui import QVBoxLayout, QAbstractItemView +from PyQt5.QtCore import QSize +from PyQt5.QtGui import QVBoxLayout, QAbstractItemView from hscommon.trans import trget from ..base.details_dialog import DetailsDialog as DetailsDialogBase diff --git a/qt/me/preferences_dialog.py b/qt/me/preferences_dialog.py index 8b699ae8..9fc9fed6 100644 --- a/qt/me/preferences_dialog.py +++ b/qt/me/preferences_dialog.py @@ -7,8 +7,8 @@ # http://www.hardcoded.net/licenses/bsd_license import sys -from PyQt4.QtCore import QSize -from PyQt4.QtGui import (QVBoxLayout, QHBoxLayout, QLabel, QSizePolicy, QSpacerItem, QWidget, +from PyQt5.QtCore import QSize +from PyQt5.QtWidgets import (QVBoxLayout, QHBoxLayout, QLabel, QSizePolicy, QSpacerItem, QWidget, QApplication) from hscommon.trans import trget diff --git a/qt/pe/app.py b/qt/pe/app.py index 31ea7a76..d90f18e9 100644 --- a/qt/pe/app.py +++ b/qt/pe/app.py @@ -8,7 +8,7 @@ import logging -from PyQt4.QtGui import QImage, QImageReader, QTransform +from PyQt5.QtGui import QImage, QImageReader, QTransform from core_pe import __appname__ from core_pe.photo import Photo as PhotoBase diff --git a/qt/pe/details_dialog.py b/qt/pe/details_dialog.py index 4fb2ba30..44cb9f55 100644 --- a/qt/pe/details_dialog.py +++ b/qt/pe/details_dialog.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt, QSize -from PyQt4.QtGui import QVBoxLayout, QAbstractItemView, QHBoxLayout, QLabel, QSizePolicy, QPixmap +from PyQt5.QtCore import Qt, QSize +from PyQt5.QtGui import QVBoxLayout, QAbstractItemView, QHBoxLayout, QLabel, QSizePolicy, QPixmap from hscommon.trans import trget from ..base.details_dialog import DetailsDialog as DetailsDialogBase diff --git a/qt/pe/preferences_dialog.py b/qt/pe/preferences_dialog.py index a0ca7236..ca15d343 100644 --- a/qt/pe/preferences_dialog.py +++ b/qt/pe/preferences_dialog.py @@ -7,7 +7,7 @@ # http://www.hardcoded.net/licenses/bsd_license import sys -from PyQt4.QtGui import QApplication +from PyQt5.QtWidgets import QApplication from hscommon.trans import trget from core.scanner import ScanType diff --git a/qt/pe/result_window.py b/qt/pe/result_window.py index 540da9e1..7fe43b69 100644 --- a/qt/pe/result_window.py +++ b/qt/pe/result_window.py @@ -6,7 +6,7 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtGui import QMessageBox, QAction +from PyQt5.QtGui import QMessageBox, QAction from hscommon.trans import trget from ..base.result_window import ResultWindow as ResultWindowBase diff --git a/qt/run_template.py b/qt/run_template.py index 73da88c3..0a209897 100644 --- a/qt/run_template.py +++ b/qt/run_template.py @@ -8,8 +8,9 @@ import sys import os.path as op -from PyQt4.QtCore import QCoreApplication, QSettings -from PyQt4.QtGui import QApplication, QIcon, QPixmap +from PyQt5.QtCore import QCoreApplication, QSettings +from PyQt5.QtGui import QIcon, QPixmap +from PyQt5.QtWidgets import QApplication from hscommon.plat import ISWINDOWS from hscommon.trans import install_gettext_trans_under_qt diff --git a/qt/se/details_dialog.py b/qt/se/details_dialog.py index e67a3568..47c892ea 100644 --- a/qt/se/details_dialog.py +++ b/qt/se/details_dialog.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import QSize -from PyQt4.QtGui import QVBoxLayout, QAbstractItemView +from PyQt5.QtCore import QSize +from PyQt5.QtWidgets import QVBoxLayout, QAbstractItemView from hscommon.trans import trget from ..base.details_dialog import DetailsDialog as DetailsDialogBase @@ -22,7 +22,7 @@ class DetailsDialog(DetailsDialogBase): self.setMinimumSize(QSize(200, 0)) self.verticalLayout = QVBoxLayout(self) self.verticalLayout.setSpacing(0) - self.verticalLayout.setMargin(0) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.tableView = DetailsTable(self) self.tableView.setAlternatingRowColors(True) self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows) diff --git a/qt/se/preferences_dialog.py b/qt/se/preferences_dialog.py index d8f17534..a44105ea 100644 --- a/qt/se/preferences_dialog.py +++ b/qt/se/preferences_dialog.py @@ -7,8 +7,8 @@ # http://www.hardcoded.net/licenses/bsd_license import sys -from PyQt4.QtCore import QSize -from PyQt4.QtGui import (QVBoxLayout, QHBoxLayout, QLabel, QSizePolicy, QSpacerItem, QWidget, +from PyQt5.QtCore import QSize +from PyQt5.QtWidgets import (QVBoxLayout, QHBoxLayout, QLabel, QSizePolicy, QSpacerItem, QWidget, QLineEdit, QApplication) from hscommon.plat import ISWINDOWS, ISLINUX diff --git a/qtlib/about_box.py b/qtlib/about_box.py index 00632aad..063a70df 100644 --- a/qtlib/about_box.py +++ b/qtlib/about_box.py @@ -6,9 +6,10 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt, QCoreApplication -from PyQt4.QtGui import (QDialog, QDialogButtonBox, QPixmap, QSizePolicy, QHBoxLayout, QVBoxLayout, - QLabel, QFont, QApplication) +from PyQt5.QtCore import Qt, QCoreApplication +from PyQt5.QtGui import QPixmap, QFont +from PyQt5.QtWidgets import (QDialog, QDialogButtonBox, QSizePolicy, QHBoxLayout, QVBoxLayout, + QLabel, QApplication) from hscommon.trans import trget diff --git a/qtlib/app.py b/qtlib/app.py index 1fafafce..1426f260 100644 --- a/qtlib/app.py +++ b/qtlib/app.py @@ -7,7 +7,7 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import SIGNAL, QTimer, QObject +from PyQt5.QtCore import SIGNAL, QTimer, QObject class Application(QObject): def __init__(self): diff --git a/qtlib/column.py b/qtlib/column.py index 7b1ff129..1d9716f7 100644 --- a/qtlib/column.py +++ b/qtlib/column.py @@ -6,7 +6,7 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt +from PyQt5.QtCore import Qt class Column: def __init__(self, attrname, defaultWidth, editor=None, alignment=Qt.AlignLeft, cantTruncate=False): diff --git a/qtlib/error_report_dialog.py b/qtlib/error_report_dialog.py index baa9ea74..a1d6e7c8 100644 --- a/qtlib/error_report_dialog.py +++ b/qtlib/error_report_dialog.py @@ -10,9 +10,10 @@ import traceback import sys import os -from PyQt4.QtCore import Qt, QUrl, QCoreApplication, QSize -from PyQt4.QtGui import (QDialog, QDesktopServices, QVBoxLayout, QHBoxLayout, QLabel, - QPlainTextEdit, QPushButton, QApplication) +from PyQt5.QtCore import Qt, QUrl, QCoreApplication, QSize +from PyQt5.QtGui import QDesktopServices +from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPlainTextEdit, QPushButton, + QApplication) from hscommon.trans import trget from .util import horizontalSpacer diff --git a/qtlib/preferences.py b/qtlib/preferences.py index 21df10b0..c46ed9e9 100644 --- a/qtlib/preferences.py +++ b/qtlib/preferences.py @@ -6,7 +6,7 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt, QSettings, QRect, QPyNullVariant +from PyQt5.QtCore import Qt, QSettings, QRect from hscommon.trans import trget from hscommon.util import tryint @@ -52,8 +52,6 @@ def adjust_after_deserialization(v): return False else: return tryint(v, v) - if isinstance(v, QPyNullVariant): - return None return v # About QRect conversion: diff --git a/qtlib/progress_window.py b/qtlib/progress_window.py index cc7057c0..e9f48dde 100644 --- a/qtlib/progress_window.py +++ b/qtlib/progress_window.py @@ -6,8 +6,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt, QTimer -from PyQt4.QtGui import QProgressDialog +from PyQt5.QtCore import Qt, QTimer +from PyQt5.QtWidgets import QProgressDialog class ProgressWindow(QProgressDialog): def __init__(self, parent, model): diff --git a/qtlib/radio_box.py b/qtlib/radio_box.py index d786c881..59c58d60 100644 --- a/qtlib/radio_box.py +++ b/qtlib/radio_box.py @@ -5,8 +5,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import pyqtSignal -from PyQt4.QtGui import QWidget, QHBoxLayout, QRadioButton +from PyQt5.QtCore import pyqtSignal +from PyQt5.QtWidgets import QWidget, QHBoxLayout, QRadioButton from .util import horizontalSpacer diff --git a/qtlib/recent.py b/qtlib/recent.py index a75b529e..fa17eebe 100644 --- a/qtlib/recent.py +++ b/qtlib/recent.py @@ -8,8 +8,8 @@ from collections import namedtuple -from PyQt4.QtCore import pyqtSignal, QObject -from PyQt4.QtGui import QAction +from PyQt5.QtCore import pyqtSignal, QObject +from PyQt5.QtWidgets import QAction from hscommon.trans import trget from hscommon.util import dedupe diff --git a/qtlib/reg.py b/qtlib/reg.py index c66c578d..891e1971 100644 --- a/qtlib/reg.py +++ b/qtlib/reg.py @@ -6,7 +6,7 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtGui import QDialog +from PyQt5.QtWidgets import QDialog from .reg_submit_dialog import RegSubmitDialog from .reg_demo_dialog import RegDemoDialog diff --git a/qtlib/reg_demo_dialog.py b/qtlib/reg_demo_dialog.py index e6675d6a..ef6dae6f 100644 --- a/qtlib/reg_demo_dialog.py +++ b/qtlib/reg_demo_dialog.py @@ -8,9 +8,9 @@ import sys -from PyQt4.QtCore import Qt, QCoreApplication -from PyQt4.QtGui import (QDialog, QApplication, QVBoxLayout, QHBoxLayout, QLabel, - QFont, QSpacerItem, QSizePolicy, QPushButton) +from PyQt5.QtCore import Qt, QCoreApplication +from PyQt5.QtWidgets import (QDialog, QApplication, QVBoxLayout, QHBoxLayout, QLabel, QSpacerItem, + QSizePolicy, QPushButton) from hscommon.plat import ISLINUX from hscommon.trans import trget diff --git a/qtlib/reg_submit_dialog.py b/qtlib/reg_submit_dialog.py index 9a55a108..96e5ffa9 100644 --- a/qtlib/reg_submit_dialog.py +++ b/qtlib/reg_submit_dialog.py @@ -8,8 +8,8 @@ import sys -from PyQt4.QtCore import Qt, QCoreApplication -from PyQt4.QtGui import (QDialog, QApplication, QVBoxLayout, QHBoxLayout, QLabel, QFormLayout, +from PyQt5.QtCore import Qt, QCoreApplication +from PyQt5.QtWidgets import (QDialog, QApplication, QVBoxLayout, QHBoxLayout, QLabel, QFormLayout, QLayout, QLineEdit, QPushButton, QSpacerItem, QSizePolicy) from hscommon.trans import trget diff --git a/qtlib/search_edit.py b/qtlib/search_edit.py index e5cd9bc4..5653cb5a 100644 --- a/qtlib/search_edit.py +++ b/qtlib/search_edit.py @@ -6,9 +6,9 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import pyqtSignal, Qt -from PyQt4.QtGui import (QToolButton, QLineEdit, QIcon, QPixmap, QStyle, QStyleOptionFrameV2, - QPainter, QPalette) +from PyQt5.QtCore import pyqtSignal, Qt +from PyQt5.QtGui import QIcon, QPixmap, QPainter, QPalette +from PyQt5.QtWidgets import QToolButton, QLineEdit, QStyle, QStyleOptionFrame from hscommon.trans import trget @@ -66,7 +66,7 @@ class SearchEdit(QLineEdit): def paintEvent(self, event): QLineEdit.paintEvent(self, event) if not bool(self.text()) and self.inactiveText and not self.hasFocus(): - panel = QStyleOptionFrameV2() + panel = QStyleOptionFrame() self.initStyleOption(panel) textRect = self.style().subElementRect(QStyle.SE_LineEditContents, panel, self) leftMargin = 2 diff --git a/qtlib/selectable_list.py b/qtlib/selectable_list.py index 48e96f53..8bbd507a 100644 --- a/qtlib/selectable_list.py +++ b/qtlib/selectable_list.py @@ -6,8 +6,7 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt, QAbstractListModel -from PyQt4.QtGui import QItemSelection, QItemSelectionModel +from PyQt5.QtCore import Qt, QAbstractListModel, QItemSelection, QItemSelectionModel class SelectableList(QAbstractListModel): def __init__(self, model, view): diff --git a/qtlib/table.py b/qtlib/table.py index 3e4fea86..90d31338 100644 --- a/qtlib/table.py +++ b/qtlib/table.py @@ -6,8 +6,7 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from PyQt4.QtCore import Qt, QAbstractTableModel, QModelIndex -from PyQt4.QtGui import QItemSelectionModel, QItemSelection +from PyQt5.QtCore import Qt, QAbstractTableModel, QModelIndex, QItemSelectionModel, QItemSelection from .column import Columns @@ -135,7 +134,8 @@ class Table(QAbstractTableModel): #--- model --> view def refresh(self): - self.reset() + self.beginResetModel() + self.endResetModel() self._updateViewSelection() def show_selected_row(self): diff --git a/qtlib/tree_model.py b/qtlib/tree_model.py index 99eb3045..f880c39f 100644 --- a/qtlib/tree_model.py +++ b/qtlib/tree_model.py @@ -8,7 +8,7 @@ import logging -from PyQt4.QtCore import QAbstractItemModel, QModelIndex +from PyQt5.QtCore import QAbstractItemModel, QModelIndex class NodeContainer: def __init__(self): @@ -128,10 +128,11 @@ class TreeModel(QAbstractItemModel, NodeContainer): return self.createIndex(node.parent.row, 0, node.parent) def reset(self): + QAbstractItemModel.beginResetModel(self) self.invalidate() self._ref2node = {} self._dummyNodes = set() - QAbstractItemModel.reset(self) + QAbstractItemModel.endResetModel(self) def rowCount(self, parent=QModelIndex()): node = parent.internalPointer() if parent.isValid() else self diff --git a/qtlib/util.py b/qtlib/util.py index 4f36350f..c3e024c2 100644 --- a/qtlib/util.py +++ b/qtlib/util.py @@ -14,8 +14,9 @@ import logging from hscommon.util import first -from PyQt4.QtGui import (QDesktopWidget, QSpacerItem, QSizePolicy, QPixmap, QIcon, QAction, - QHBoxLayout, QDesktopServices) +from PyQt5.QtCore import QStandardPaths +from PyQt5.QtGui import QPixmap, QIcon +from PyQt5.QtWidgets import QDesktopWidget, QSpacerItem, QSizePolicy, QAction, QHBoxLayout def moveToScreenCenter(widget): frame = widget.frameGeometry() @@ -75,7 +76,7 @@ def setAccelKeys(menu): action.setText(newtext) def getAppData(): - return str(QDesktopServices.storageLocation(QDesktopServices.DataLocation)) + return QStandardPaths.standardLocations(QStandardPaths.DataLocation)[0] class SysWrapper(io.IOBase): def write(self, s):