From 098f178dfc3b5d704fd1b371f7c27f7bde8eae0f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 20 Apr 2014 13:28:04 +0530 Subject: [PATCH] Port usage of QString and various miscellaneous imports that no longer work --- setup/qt5-migrate.py | 2 ++ src/calibre/ebooks/oeb/polish/stats.py | 6 +++--- src/calibre/ebooks/pdf/render/from_html.py | 8 +++---- src/calibre/ebooks/pdf/writer.py | 6 +++--- src/calibre/gui2/convert/bulk.py | 4 ++-- src/calibre/gui2/convert/single.py | 6 +++--- src/calibre/gui2/dialogs/conversion_error.py | 3 ++- .../gui2/dialogs/device_category_editor.py | 13 ++++++------ .../gui2/dialogs/saved_search_editor.py | 2 +- src/calibre/gui2/dialogs/tag_list_editor.py | 21 +++++++++---------- src/calibre/gui2/jobs.py | 6 +++--- src/calibre/gui2/lrf_renderer/bookview.py | 3 +-- src/calibre/gui2/lrf_renderer/document.py | 7 +++---- src/calibre/gui2/lrf_renderer/main.py | 5 ++--- src/calibre/gui2/lrf_renderer/text.py | 8 +++---- src/calibre/gui2/search_box.py | 6 +++--- src/calibre/gui2/tag_browser/ui.py | 4 ++-- src/calibre/gui2/tools.py | 4 ++-- src/calibre/gui2/tweak_book/editor/text.py | 10 +-------- src/calibre/gui2/viewer/documentview.py | 6 +++--- src/calibre/utils/config_base.py | 14 +++++++------ 21 files changed, 68 insertions(+), 76 deletions(-) diff --git a/setup/qt5-migrate.py b/setup/qt5-migrate.py index ba30136b98..ff77a9d47d 100644 --- a/setup/qt5-migrate.py +++ b/setup/qt5-migrate.py @@ -18,6 +18,8 @@ __copyright__ = '2014, Kovid Goyal ' # them to check that they work. This can probably be made part of python # setup.py check. +# QT5XX: Check that DeviceCategoryEditor and TagListEditor work + # QT5XX: Delete this file after migration is completed import os diff --git a/src/calibre/ebooks/oeb/polish/stats.py b/src/calibre/ebooks/oeb/polish/stats.py index 4c6a3b0801..118fcdb98d 100644 --- a/src/calibre/ebooks/oeb/polish/stats.py +++ b/src/calibre/ebooks/oeb/polish/stats.py @@ -12,7 +12,7 @@ from urllib import unquote from collections import defaultdict from cssutils import CSSParser -from PyQt5.Qt import (pyqtProperty, QString, QEventLoop, Qt, QSize, QTimer, +from PyQt5.Qt import (pyqtProperty, QEventLoop, Qt, QSize, QTimer, pyqtSlot) from PyQt5.QtWebKitWidgets import QWebPage, QWebView @@ -130,14 +130,14 @@ class Page(QWebPage): # {{{ def _pass_json_value_getter(self): val = json.dumps(self.bridge_value) - return QString(val) + return val def _pass_json_value_setter(self, value): # Qt WebKit in Qt 4.x adds extra null bytes to the end of the string # if the JSON contains non-BMP characters self.bridge_value = json.loads(unicode(value).rstrip('\0')) - _pass_json_value = pyqtProperty(QString, fget=_pass_json_value_getter, + _pass_json_value = pyqtProperty(str, fget=_pass_json_value_getter, fset=_pass_json_value_setter) def load_js(self): diff --git a/src/calibre/ebooks/pdf/render/from_html.py b/src/calibre/ebooks/pdf/render/from_html.py index 03b9e8bda8..cc6affa8dd 100644 --- a/src/calibre/ebooks/pdf/render/from_html.py +++ b/src/calibre/ebooks/pdf/render/from_html.py @@ -12,8 +12,8 @@ from future_builtins import map from math import floor from collections import defaultdict -from PyQt5.Qt import (QObject, QPainter, Qt, QSize, QString, QTimer, - pyqtProperty, QEventLoop, QPixmap, QRect, pyqtSlot) +from PyQt5.Qt import ( + QObject, QPainter, Qt, QSize, QTimer, pyqtProperty, QEventLoop, QPixmap, QRect, pyqtSlot) from PyQt5.QtWebKit import QWebSettings from PyQt5.QtWebKitWidgets import QWebView, QWebPage @@ -125,12 +125,12 @@ class PDFWriter(QObject): def _pass_json_value_getter(self): val = json.dumps(self.bridge_value) - return QString(val) + return val def _pass_json_value_setter(self, value): self.bridge_value = json.loads(unicode(value)) - _pass_json_value = pyqtProperty(QString, fget=_pass_json_value_getter, + _pass_json_value = pyqtProperty(str, fget=_pass_json_value_getter, fset=_pass_json_value_setter) @pyqtSlot(result=unicode) diff --git a/src/calibre/ebooks/pdf/writer.py b/src/calibre/ebooks/pdf/writer.py index 0e3ec4bd80..636dfd5aaf 100644 --- a/src/calibre/ebooks/pdf/writer.py +++ b/src/calibre/ebooks/pdf/writer.py @@ -11,7 +11,7 @@ Write content to PDF. import os, shutil, json from PyQt5.Qt import (QEventLoop, QObject, QPrinter, QSizeF, Qt, QPainter, - QPixmap, QTimer, pyqtProperty, QString, QSize) + QPixmap, QTimer, pyqtProperty, QSize) from PyQt5.QtWebKit import QWebSettings from PyQt5.QtWebKitWidgets import QWebView, QWebPage @@ -221,12 +221,12 @@ class PDFWriter(QObject): # {{{ def _pass_json_value_getter(self): val = json.dumps(self.bridge_value) - return QString(val) + return val def _pass_json_value_setter(self, value): self.bridge_value = json.loads(unicode(value)) - _pass_json_value = pyqtProperty(QString, fget=_pass_json_value_getter, + _pass_json_value = pyqtProperty(str, fget=_pass_json_value_getter, fset=_pass_json_value_setter) def setup_printer(self, outpath): diff --git a/src/calibre/gui2/convert/bulk.py b/src/calibre/gui2/convert/bulk.py index 78e9847228..536a987976 100644 --- a/src/calibre/gui2/convert/bulk.py +++ b/src/calibre/gui2/convert/bulk.py @@ -6,7 +6,7 @@ __docformat__ = 'restructuredtext en' import shutil -from PyQt5.Qt import QString, QModelIndex +from PyQt5.Qt import QModelIndex from calibre.gui2.convert.single import (Config, sort_formats_by_preference, GroupModel, gprefs, get_output_formats) @@ -120,7 +120,7 @@ class BulkConfig(Config): preferred_output_format and preferred_output_format \ in output_formats else sort_formats_by_preference(output_formats, [prefs['output_format']])[0] - self.output_formats.addItems(list(map(QString, [x.upper() for x in + self.output_formats.addItems(list(map(unicode, [x.upper() for x in output_formats]))) self.output_formats.setCurrentIndex(output_formats.index(preferred_output_format)) diff --git a/src/calibre/gui2/convert/single.py b/src/calibre/gui2/convert/single.py index ec761e07f4..cd67ef0600 100644 --- a/src/calibre/gui2/convert/single.py +++ b/src/calibre/gui2/convert/single.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' import cPickle, shutil -from PyQt5.Qt import QString, QAbstractListModel, Qt, QVariant, QFont, QModelIndex +from PyQt5.Qt import QAbstractListModel, Qt, QVariant, QFont, QModelIndex from calibre.gui2 import ResizableDialog, NONE, gprefs from calibre.ebooks.conversion.config import (GuiRecommendations, save_specifics, @@ -254,9 +254,9 @@ class Config(ResizableDialog, Ui_Dialog): preferred_output_format in output_formats else \ sort_formats_by_preference(output_formats, [prefs['output_format']])[0] - self.input_formats.addItems(list(map(QString, [x.upper() for x in + self.input_formats.addItems(list(map(unicode, [x.upper() for x in input_formats]))) - self.output_formats.addItems(list(map(QString, [x.upper() for x in + self.output_formats.addItems(list(map(unicode, [x.upper() for x in output_formats]))) self.input_formats.setCurrentIndex(input_formats.index(input_format)) self.output_formats.setCurrentIndex(output_formats.index(preferred_output_format)) diff --git a/src/calibre/gui2/dialogs/conversion_error.py b/src/calibre/gui2/dialogs/conversion_error.py index ea2e9ec105..47447a1268 100644 --- a/src/calibre/gui2/dialogs/conversion_error.py +++ b/src/calibre/gui2/dialogs/conversion_error.py @@ -1,6 +1,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from PyQt5.QtGui import QDialog + +from PyQt5.Qt import QDialog from calibre.gui2.dialogs.conversion_error_ui import Ui_ConversionErrorDialog diff --git a/src/calibre/gui2/dialogs/device_category_editor.py b/src/calibre/gui2/dialogs/device_category_editor.py index 2ae2de5635..20f628e70c 100644 --- a/src/calibre/gui2/dialogs/device_category_editor.py +++ b/src/calibre/gui2/dialogs/device_category_editor.py @@ -1,8 +1,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from PyQt5.QtCore import Qt, QString -from PyQt5.QtGui import QDialog, QListWidgetItem +from PyQt5.Qt import Qt, QDialog, QListWidgetItem from calibre.gui2.dialogs.device_category_editor_ui import Ui_DeviceCategoryEditor from calibre.gui2 import question_dialog, error_dialog @@ -11,9 +10,9 @@ class ListWidgetItem(QListWidgetItem): def __init__(self, txt): QListWidgetItem.__init__(self, txt) - self.initial_value = QString(txt) - self.current_value = QString(txt) - self.previous_value = QString(txt) + self.initial_value = txt + self.current_value = txt + self.previous_value = txt def data(self, role): if role == Qt.DisplayRole: @@ -30,7 +29,7 @@ class ListWidgetItem(QListWidgetItem): def setData(self, role, data): if role == Qt.EditRole: self.previous_value = self.current_value - self.current_value = data.toString() + self.current_value = data QListWidgetItem.setData(self, role, data) def text(self): @@ -68,7 +67,7 @@ class DeviceCategoryEditor(QDialog, Ui_DeviceCategoryEditor): for tag in sorted(self.all_tags.keys(), key=key): item = ListWidgetItem(tag) item.setData(Qt.UserRole, self.all_tags[tag]) - item.setFlags (item.flags() | Qt.ItemIsEditable) + item.setFlags(item.flags() | Qt.ItemIsEditable) self.available_tags.addItem(item) if tag_to_match is not None: diff --git a/src/calibre/gui2/dialogs/saved_search_editor.py b/src/calibre/gui2/dialogs/saved_search_editor.py index 53c6b71edc..5a5de62771 100644 --- a/src/calibre/gui2/dialogs/saved_search_editor.py +++ b/src/calibre/gui2/dialogs/saved_search_editor.py @@ -3,7 +3,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from PyQt5.QtGui import QDialog +from PyQt5.Qt import QDialog from calibre.gui2.dialogs.saved_search_editor_ui import Ui_SavedSearchEditor from calibre.utils.icu import sort_key diff --git a/src/calibre/gui2/dialogs/tag_list_editor.py b/src/calibre/gui2/dialogs/tag_list_editor.py index 2599b48bb1..ebe9471c49 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.py +++ b/src/calibre/gui2/dialogs/tag_list_editor.py @@ -1,8 +1,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from PyQt5.Qt import (Qt, QDialog, QTableWidgetItem, QIcon, QByteArray, - QString, QSize) +from PyQt5.Qt import (Qt, QDialog, QTableWidgetItem, QIcon, QByteArray, QSize) from calibre.gui2.dialogs.tag_list_editor_ui import Ui_TagListEditor from calibre.gui2 import question_dialog, error_dialog, info_dialog, gprefs @@ -12,9 +11,9 @@ class NameTableWidgetItem(QTableWidgetItem): def __init__(self, txt): QTableWidgetItem.__init__(self, txt) - self.initial_value = QString(txt) - self.current_value = QString(txt) - self.previous_value = QString(txt) + self.initial_value = txt + self.current_value = txt + self.previous_value = txt def data(self, role): if role == Qt.DisplayRole: @@ -27,7 +26,7 @@ class NameTableWidgetItem(QTableWidgetItem): def setData(self, role, data): if role == Qt.EditRole: self.previous_value = self.current_value - self.current_value = data.toString() + self.current_value = data QTableWidgetItem.setData(self, role, data) def text(self): @@ -113,7 +112,7 @@ class TagListEditor(QDialog, Ui_TagListEditor): self.count_col.setIcon(self.blank_icon) # Capture clicks on the horizontal header to sort the table columns - hh = self.table.horizontalHeader(); + hh = self.table.horizontalHeader() hh.setClickable(True) hh.sectionClicked.connect(self.header_clicked) hh.sectionResized.connect(self.table_column_resized) @@ -127,16 +126,16 @@ class TagListEditor(QDialog, Ui_TagListEditor): for row,tag in enumerate(sorted(self.all_tags.keys(), key=sorter)): item = NameTableWidgetItem(tag) item.setData(Qt.UserRole, self.all_tags[tag]) - item.setFlags (item.flags() | Qt.ItemIsSelectable | Qt.ItemIsEditable) + item.setFlags(item.flags() | Qt.ItemIsSelectable | Qt.ItemIsEditable) self.table.setItem(row, 0, item) if tag == tag_to_match: select_item = item item = CountTableWidgetItem(self.counts[tag]) # only the name column can be selected - item.setFlags (item.flags() & ~(Qt.ItemIsSelectable|Qt.ItemIsEditable)) + item.setFlags(item.flags() & ~(Qt.ItemIsSelectable|Qt.ItemIsEditable)) self.table.setItem(row, 1, item) item = QTableWidgetItem('') - item.setFlags (item.flags() & ~(Qt.ItemIsSelectable|Qt.ItemIsEditable)) + item.setFlags(item.flags() & ~(Qt.ItemIsSelectable|Qt.ItemIsEditable)) self.table.setItem(row, 2, item) # Scroll to the selected item if there is one @@ -266,7 +265,7 @@ class TagListEditor(QDialog, Ui_TagListEditor): self.count_col.setIcon(self.blank_icon) self.was_col.setIcon(self.blank_icon) - def do_sort_by_count (self): + def do_sort_by_count(self): self.count_order = 1 if self.count_order == 0 else 0 self.table.sortByColumn(1, self.count_order) self.count_col.setIcon(self.down_arrow_icon if self.count_order diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index 4ca4b2a971..5ccaf5a694 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -12,7 +12,7 @@ from Queue import Empty, Queue from PyQt5.Qt import (QAbstractTableModel, QVariant, QModelIndex, Qt, QTimer, pyqtSignal, QIcon, QDialog, QAbstractItemDelegate, QApplication, - QSize, QStyleOptionProgressBarV2, QString, QStyle, QToolTip, QFrame, + QSize, QStyleOptionProgressBar, QStyle, QToolTip, QFrame, QHBoxLayout, QVBoxLayout, QSizePolicy, QLabel, QCoreApplication, QAction, QByteArray, QSortFilterProxyModel) @@ -387,7 +387,7 @@ class ProgressBarDelegate(QAbstractItemDelegate): # {{{ return QSize(120, 30) def paint(self, painter, option, index): - opts = QStyleOptionProgressBarV2() + opts = QStyleOptionProgressBar() opts.rect = option.rect opts.minimum = 1 opts.maximum = 100 @@ -396,7 +396,7 @@ class ProgressBarDelegate(QAbstractItemDelegate): # {{{ if not ok: percent = 0 opts.progress = percent - opts.text = QString(_('Unavailable') if percent == 0 else '%d%%'%percent) + opts.text = (_('Unavailable') if percent == 0 else '%d%%'%percent) QApplication.style().drawControl(QStyle.CE_ProgressBar, opts, painter) # }}} diff --git a/src/calibre/gui2/lrf_renderer/bookview.py b/src/calibre/gui2/lrf_renderer/bookview.py index 033e19b220..2c1d6628fb 100644 --- a/src/calibre/gui2/lrf_renderer/bookview.py +++ b/src/calibre/gui2/lrf_renderer/bookview.py @@ -1,8 +1,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from PyQt5.QtGui import QGraphicsView -from PyQt5.QtCore import QSize +from PyQt5.Qt import QGraphicsView, QSize class BookView(QGraphicsView): diff --git a/src/calibre/gui2/lrf_renderer/document.py b/src/calibre/gui2/lrf_renderer/document.py index 08251d6436..b29147ea22 100644 --- a/src/calibre/gui2/lrf_renderer/document.py +++ b/src/calibre/gui2/lrf_renderer/document.py @@ -2,10 +2,9 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' import collections, itertools, glob -from PyQt5.QtCore import Qt, QByteArray, pyqtSignal -from PyQt5.QtGui import QGraphicsRectItem, QGraphicsScene, QPen, \ - QBrush, QColor, QFontDatabase, \ - QGraphicsItem, QGraphicsLineItem +from PyQt5.Qt import ( + Qt, QByteArray, pyqtSignal, QGraphicsRectItem, QGraphicsScene, QPen, + QBrush, QColor, QFontDatabase, QGraphicsItem, QGraphicsLineItem) from calibre.gui2.lrf_renderer.text import TextBlock, FontLoader, COLOR, PixmapItem diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index b263d1fcdd..384823bed6 100644 --- a/src/calibre/gui2/lrf_renderer/main.py +++ b/src/calibre/gui2/lrf_renderer/main.py @@ -2,8 +2,8 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' import sys, logging, os, traceback, time -from PyQt5.QtGui import QKeySequence, QPainter, QDialog, QSpinBox, QSlider, QIcon -from PyQt5.QtCore import Qt, QCoreApplication, QThread +from PyQt5.Qt import ( + QKeySequence, QPainter, QDialog, QSpinBox, QSlider, QIcon, Qt, QCoreApplication, QThread, QScrollBar) from calibre import __appname__, setup_cli_handlers, islinux, isbsd from calibre.ebooks.lrf.lrfparser import LRFDocument @@ -162,7 +162,6 @@ class Main(MainWindow, Ui_MainWindow): self.renderer.lrf.device_info.height hdelta = self.tool_bar.height()+3 - from PyQt5.QtGui import QScrollBar s = QScrollBar(self) scrollbar_adjust = min(s.width(), s.height()) self.graphics_view.resize_for(width+scrollbar_adjust, height+scrollbar_adjust) diff --git a/src/calibre/gui2/lrf_renderer/text.py b/src/calibre/gui2/lrf_renderer/text.py index 2b9197daa2..c5ee185691 100644 --- a/src/calibre/gui2/lrf_renderer/text.py +++ b/src/calibre/gui2/lrf_renderer/text.py @@ -2,9 +2,9 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' import sys, collections, operator, copy, re -from PyQt5.QtCore import Qt, QRectF, QString -from PyQt5.QtGui import QFont, QColor, QPixmap, QGraphicsPixmapItem, \ - QGraphicsItem, QFontMetrics, QPen, QBrush, QGraphicsRectItem +from PyQt5.Qt import ( + Qt, QRectF, QFont, QColor, QPixmap, QGraphicsPixmapItem, QGraphicsItem, + QFontMetrics, QPen, QBrush, QGraphicsRectItem) from calibre.ebooks.lrf.fonts import LIBERATION_FONT_MAP from calibre.ebooks.BeautifulSoup import Tag @@ -565,7 +565,7 @@ class Line(QGraphicsItem): class Word(object): def __init__(self, string, width, height, ts, font, valign): - self.string, self.width, self.height = QString(string), width, height + self.string, self.width, self.height = string, width, height self.font = font self.text_color = ts.textcolor self.highlight = False diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 49b3e26c7e..eb7fbcf8d0 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -12,7 +12,7 @@ from functools import partial from PyQt5.Qt import QComboBox, Qt, QLineEdit, pyqtSlot, QDialog, \ pyqtSignal, QCompleter, QAction, QKeySequence, QTimer, \ - QString, QIcon, QMenu + QIcon, QMenu from calibre.gui2 import config, error_dialog, question_dialog, gprefs from calibre.gui2.dialogs.confirm_delete import confirm @@ -84,8 +84,8 @@ class SearchBox2(QComboBox): # {{{ c = self.line_edit.completer() c.setCompletionMode(c.PopupCompletion) - c.highlighted[QString].connect(self.completer_used) - c.activated[QString].connect(self.history_selected) + c.highlighted[str].connect(self.completer_used) + c.activated[str].connect(self.history_selected) self.line_edit.key_pressed.connect(self.key_pressed, type=Qt.DirectConnection) self.activated.connect(self.history_selected) diff --git a/src/calibre/gui2/tag_browser/ui.py b/src/calibre/gui2/tag_browser/ui.py index ff20e4b92d..8be77ca58c 100644 --- a/src/calibre/gui2/tag_browser/ui.py +++ b/src/calibre/gui2/tag_browser/ui.py @@ -10,7 +10,7 @@ __docformat__ = 'restructuredtext en' from functools import partial from PyQt5.Qt import (Qt, QIcon, QWidget, QHBoxLayout, QVBoxLayout, QShortcut, - QKeySequence, QToolButton, QString, QLabel, QFrame, QTimer, + QKeySequence, QToolButton, QLabel, QFrame, QTimer, QMenu, QPushButton, QActionGroup) from calibre.gui2 import error_dialog, question_dialog @@ -370,7 +370,7 @@ class TagBrowserWidget(QWidget): # {{{ self.item_search.initialize('tag_browser_search') self.item_search.lineEdit().returnPressed.connect(self.do_find) self.item_search.lineEdit().textEdited.connect(self.find_text_changed) - self.item_search.activated[QString].connect(self.do_find) + self.item_search.activated[str].connect(self.do_find) self.item_search.completer().setCaseSensitivity(Qt.CaseSensitive) parent.tags_view = TagsView(parent) diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index 55c9a5a8e8..617f1e578f 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -9,7 +9,7 @@ Logic for setting up conversion jobs import cPickle, os -from PyQt5.Qt import QDialog, QProgressDialog, QString, QTimer +from PyQt5.Qt import QDialog, QProgressDialog, QTimer from calibre.ptempfile import PersistentTemporaryFile from calibre.gui2 import warning_dialog, question_dialog @@ -151,7 +151,7 @@ class QueueBulk(QProgressDialog): def __init__(self, parent, book_ids, output_format, queue, db, user_recs, args, use_saved_single_settings=True): QProgressDialog.__init__(self, '', - QString(), 0, len(book_ids), parent) + None, 0, len(book_ids), parent) self.setWindowTitle(_('Queueing books for bulk conversion')) self.book_ids, self.output_format, self.queue, self.db, self.args, self.user_recs = \ book_ids, output_format, queue, db, args, user_recs diff --git a/src/calibre/gui2/tweak_book/editor/text.py b/src/calibre/gui2/tweak_book/editor/text.py index af4a6c2294..5dc004128f 100644 --- a/src/calibre/gui2/tweak_book/editor/text.py +++ b/src/calibre/gui2/tweak_book/editor/text.py @@ -82,15 +82,7 @@ class PlainTextEdit(QPlainTextEdit): ans = c.selectedText().replace(PARAGRAPH_SEPARATOR, '\n') # QTextCursor pads the return value of selectedText with null bytes if # non BMP characters such as 0x1f431 are present. - if hasattr(ans, 'rstrip'): - ans = ans.rstrip('\0') - else: # QString - try: - while ans[-1] == '\0': - ans.chop(1) - except IndexError: - pass # ans is an empty string - return ans + return ans.rstrip('\0') @pyqtSlot() def copy(self): diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index 0969d3327f..1968250574 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -10,7 +10,7 @@ from functools import partial from PyQt5.Qt import (QSize, QSizePolicy, QUrl, Qt, pyqtProperty, QPainter, QPalette, QBrush, QDialog, QColor, QPoint, QImage, QRegion, - QIcon, QAction, QMenu, QString, pyqtSignal, QApplication, pyqtSlot) + QIcon, QAction, QMenu, pyqtSignal, QApplication, pyqtSlot) from PyQt5.QtWebKitWidgets import QWebPage, QWebView from PyQt5.QtWebKit import QWebSettings, QWebElement @@ -225,12 +225,12 @@ class Document(QWebPage): # {{{ def _pass_json_value_getter(self): val = json.dumps(self.bridge_value) - return QString(val) + return val def _pass_json_value_setter(self, value): self.bridge_value = json.loads(unicode(value)) - _pass_json_value = pyqtProperty(QString, fget=_pass_json_value_getter, + _pass_json_value = pyqtProperty(str, fget=_pass_json_value_getter, fset=_pass_json_value_setter) def after_load(self, last_loaded_path=None): diff --git a/src/calibre/utils/config_base.py b/src/calibre/utils/config_base.py index 5d14300773..1ace09944b 100644 --- a/src/calibre/utils/config_base.py +++ b/src/calibre/utils/config_base.py @@ -195,10 +195,14 @@ class OptionSet(object): src = src.decode('utf-8') src = src.replace(u'PyQt5.QtCore', u'PyQt4.QtCore') exec src in options - except: - print 'Failed to parse options string:' - print repr(src) - traceback.print_exc() + except RuntimeError: + try: + src = src.replace('PyQt' + '4', 'PyQt5') + exec src in options + except: + print 'Failed to parse options string:' + print repr(src) + traceback.print_exc() opts = OptionValues() for pref in self.preferences: val = options.get(pref.name, pref.default) @@ -228,8 +232,6 @@ class OptionSet(object): if val is val is True or val is False or val is None or \ isinstance(val, (int, float, long, basestring)): return repr(val) - if val.__class__.__name__ == 'QString': - return repr(unicode(val)) pickle = cPickle.dumps(val, -1) return 'cPickle.loads(%s)'%repr(pickle)