def on_bridge_ready(self): f = QApplication.instance().font() fi = QFontInfo(f) family = f.family() if family in ('.AppleSystemUIFont', 'MS Shell Dlg 2'): family = 'system-ui' ui_data = { 'all_font_families': QFontDatabase().families(), 'ui_font_family': family, 'ui_font_sz': '{}px'.format(fi.pixelSize()), 'show_home_page_on_ready': self.show_home_page_on_ready, 'system_colors': system_colors(), 'QT_VERSION': QT_VERSION, 'short_time_fmt': QLocale.system().timeFormat(QLocale.FormatType.ShortFormat), } self.bridge.create_view(vprefs['session_data'], vprefs['local_storage'], field_metadata.all_metadata(), ui_data) for func, args in iteritems(self.pending_bridge_ready_actions): getattr(self.bridge, func)(*args)
def do_paint(self, painter, option, index): text = str(index.data(Qt.DisplayRole) or '') font = QFont(option.font) font.setPointSize(QFontInfo(font).pointSize() * 1.5) font2 = QFont(font) font2.setFamily(text) system, has_latin = writing_system_for_font(font2) if has_latin: font = font2 r = option.rect if option.state & QStyle.State_Selected: painter.setPen(QPen(option.palette.highlightedText(), 0)) if (option.direction == Qt.RightToLeft): r.setRight(r.right() - 4) else: r.setLeft(r.left() + 4) painter.setFont(font) painter.drawText(r, Qt.AlignVCenter|Qt.AlignLeading|Qt.TextSingleLine, text) if (system != QFontDatabase.Any): w = painter.fontMetrics().width(text + " ") painter.setFont(font2) sample = QFontDatabase().writingSystemSample(system) if (option.direction == Qt.RightToLeft): r.setRight(r.right() - w) else: r.setLeft(r.left() + w) painter.drawText(r, Qt.AlignVCenter|Qt.AlignLeading|Qt.TextSingleLine, sample)
def on_bridge_ready(self): f = QApplication.instance().font() self.bridge.create_view( vprefs['session_data'], QFontDatabase().families(), field_metadata.all_metadata(), f.family(), f.pointSize()) for func, args in iteritems(self.pending_bridge_ready_actions): getattr(self.bridge, func)(*args)
def on_bridge_ready(self): f = QApplication.instance().font() fi = QFontInfo(f) self.bridge.create_view( vprefs['session_data'], vprefs['local_storage'], QFontDatabase().families(), field_metadata.all_metadata(), f.family(), '{}px'.format(fi.pixelSize()), self.show_home_page_on_ready) for func, args in iteritems(self.pending_bridge_ready_actions): getattr(self.bridge, func)(*args)
def main(): app = QtWidgets.QApplication(sys.argv) fontDB = QFontDatabase() fontDB.applicationFontFamilies( fontDB.addApplicationFont(":/res/Harmattan.ttf")) application = AppWindowByHaies() application.show() app.exec_()
def default_font_family(): global _dff if _dff is None: families = set(map(unicode, QFontDatabase().families())) for x in ('Ubuntu Mono', 'Consolas', 'Liberation Mono'): if x in families: _dff = x break if _dff is None: _dff = 'Courier New' return _dff
def test_qt(self): from PyQt5.Qt import QImageReader, QNetworkAccessManager, QFontDatabase from calibre.utils.img import image_from_data, image_to_data, test # Ensure that images can be read before QApplication is constructed. # Note that this requires QCoreApplication.libraryPaths() to return the # path to the Qt plugins which it always does in the frozen build, # because the QT_PLUGIN_PATH env var is set. On non-frozen builds, # it should just work because the hard-coded paths of the Qt # installation should work. If they do not, then it is a distro # problem. fmts = set( map(lambda x: x.data().decode('utf-8'), QImageReader.supportedImageFormats())) testf = {'jpg', 'png', 'svg', 'ico', 'gif'} self.assertEqual( testf.intersection(fmts), testf, "Qt doesn't seem to be able to load some of its image plugins. Available plugins: %s" % fmts) data = P('images/blank.png', allow_user_override=False, data=True) img = image_from_data(data) image_from_data( P('catalog/mastheadImage.gif', allow_user_override=False, data=True)) for fmt in 'png bmp jpeg'.split(): d = image_to_data(img, fmt=fmt) image_from_data(d) # Run the imaging tests test() from calibre.gui2 import Application os.environ.pop('DISPLAY', None) has_headless = isosx or islinux app = Application([], headless=has_headless) self.assertGreaterEqual( len(QFontDatabase().families()), 5, 'The QPA headless plugin is not able to locate enough system fonts via fontconfig' ) if has_headless: from calibre.ebooks.covers import create_cover create_cover('xxx', ['yyy']) na = QNetworkAccessManager() self.assertTrue(hasattr(na, 'sslErrors'), 'Qt not compiled with openssl') from PyQt5.QtWebKitWidgets import QWebView if iswindows: from PyQt5.Qt import QtWin QtWin QWebView() del QWebView del na del app
def on_bridge_ready(self): f = QApplication.instance().font() fi = QFontInfo(f) ui_data = { 'all_font_families': QFontDatabase().families(), 'ui_font_family': f.family(), 'ui_font_sz': '{}px'.format(fi.pixelSize()), 'show_home_page_on_ready': self.show_home_page_on_ready, 'system_colors': system_colors(), } self.bridge.create_view(vprefs['session_data'], vprefs['local_storage'], field_metadata.all_metadata(), ui_data) for func, args in iteritems(self.pending_bridge_ready_actions): getattr(self.bridge, func)(*args)
def apply_theme(app): app.setStyle('Fusion') # Font font_database = QFontDatabase() font_database.addApplicationFont('source/ui/noto.ttf') app.setFont(QFont('Noto Sans CJK TC Regular', weight=QFont.Normal)) # QSS with open('source/ui/style.qss') as stylesheet: app.setStyleSheet(stylesheet.read()) # palette new_palette = QPalette() # base new_palette.setColor(QPalette.WindowText, QColor('#ABAEB0')) new_palette.setColor(QPalette.Button, QColor('#262f36')) new_palette.setColor(QPalette.Light, QColor('#D5D6D7')) new_palette.setColor(QPalette.Midlight, QColor('#05796E')) new_palette.setColor(QPalette.Dark, QColor('#1E272E')) new_palette.setColor(QPalette.Text, QColor('#ABAEB0')) new_palette.setColor(QPalette.BrightText, QColor('#e6e6e6')) new_palette.setColor(QPalette.ButtonText, QColor('#ABAEB0')) new_palette.setColor(QPalette.Base, QColor('#384047')) new_palette.setColor(QPalette.Window, QColor('#2B343B')) new_palette.setColor(QPalette.Shadow, QColor('#181F24')) new_palette.setColor(QPalette.Highlight, QColor('#07A092')) new_palette.setColor(QPalette.HighlightedText, QColor('#e6e6e6')) new_palette.setColor(QPalette.Link, QColor('#07A092')) new_palette.setColor(QPalette.AlternateBase, QColor('#262f36')) new_palette.setColor(QPalette.ToolTipBase, QColor(53, 53, 53)) new_palette.setColor(QPalette.ToolTipText, QColor('#828588')) # disabled new_palette.setColor(QPalette.Disabled, QPalette.WindowText, QColor(127, 127, 127)) new_palette.setColor(QPalette.Disabled, QPalette.Text, QColor(127, 127, 127)) new_palette.setColor(QPalette.Disabled, QPalette.ButtonText, QColor(127, 127, 127)) new_palette.setColor(QPalette.Disabled, QPalette.Highlight, QColor(80, 80, 80)) new_palette.setColor(QPalette.Disabled, QPalette.HighlightedText, QColor(127, 127, 127)) app.setPalette(new_palette)
def load(): Storage.DATABASE = QFontDatabase() if not Storage.USER_PREFERENCES_DIR.exists(): Storage.USER_PREFERENCES_DIR.mkdir() Storage.load_page_data() Storage.SOUNDS = { "tap": QSound( Storage.resolve_audio( "navigation_forward-selection-minimal.wav")) } if Storage.USER_DATA_FILE.exists(): with open(Storage.USER_DATA_FILE, "r") as file: Storage.USER_DATA = msgpack.load(file)
def test_qt(): from calibre.gui2 import Application from PyQt5.Qt import (QImageReader, QNetworkAccessManager, QFontDatabase) from PyQt5.QtWebKitWidgets import QWebView os.environ.pop('DISPLAY', None) app = Application([], headless=islinux) if len(QFontDatabase().families()) < 5: raise RuntimeError('The QPA headless plugin is not able to locate enough system fonts via fontconfig') fmts = set(map(unicode, QImageReader.supportedImageFormats())) testf = set(['jpg', 'png', 'mng', 'svg', 'ico', 'gif']) if testf.intersection(fmts) != testf: raise RuntimeError( "Qt doesn't seem to be able to load its image plugins") QWebView() del QWebView na = QNetworkAccessManager() if not hasattr(na, 'sslErrors'): raise RuntimeError('Qt not compiled with openssl') del na del app print ('Qt OK!')
def writing_system_for_font(font): has_latin = True systems = QFontDatabase().writingSystems(font.family()) # this just confuses the algorithm below. Vietnamese is Latin with lots of # special chars try: systems.remove(QFontDatabase.WritingSystem.Vietnamese) except ValueError: pass system = QFontDatabase.WritingSystem.Any if (QFontDatabase.WritingSystem.Latin not in systems): has_latin = False # we need to show something if systems: system = systems[-1] else: systems.remove(QFontDatabase.WritingSystem.Latin) if not systems: return system, has_latin if (len(systems) == 1 and systems[0] > QFontDatabase.WritingSystem.Cyrillic): return systems[0], has_latin if (len(systems) <= 2 and systems[-1] > QFontDatabase.WritingSystem.Armenian and systems[-1] < QFontDatabase.WritingSystem.Vietnamese): return systems[-1], has_latin if (len(systems) <= 5 and systems[-1] >= QFontDatabase.WritingSystem.SimplifiedChinese and systems[-1] <= QFontDatabase.WritingSystem.Korean): system = systems[-1] return system, has_latin
def __init__(self, str, owner: LabeledObject, owner_widget: GraphItem, parent=None, flags=Qt.WindowFlags()): super().__init__(str, parent=parent, flags=flags) self.__owner = owner self.__owner_widget = owner_widget font_database = QFontDatabase() # Build absolute path to prevent problems on macOS path = os.path.join(os.path.dirname(__file__), "../ressources/fonts/lmroman8-regular.otf") font_id = font_database.addApplicationFont(path) if (font_id == -1): raise IOError("Font could not be loaded") font_name = QFontDatabase.applicationFontFamilies(font_id)[0] font = QFont(font_name, 16) self.setFont(font) self.adjustSize() self.__reposition()
def __init__(self, master_password=None, urls=(), new_instance=False, shutdown=False, restart_state=None, no_session=False, run_local_server=True): if not isosx: # OS X turns this on automatically for v in ('QT_AUTO_SCREEN_SCALE_FACTOR', 'QT_SCALE_FACTOR', 'QT_SCREEN_SCALE_FACTORS', 'QT_DEVICE_PIXEL_RATIO'): if os.environ.get(v): break else: QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) QApplication.__init__(self, [appname, '-name', appname]) self.setAttribute(Qt.AA_UseHighDpiPixmaps) self.setOrganizationName('kovidgoyal') self.setApplicationName(appname) self.setApplicationVersion(str_version) self.no_session = no_session self.handle_unix_signals() if not QSslSocket.supportsSsl(): raise SystemExit('Qt has been compiled without SSL support!') from .config import font_families, font_sizes ff = font_families().get('sans-serif') or 'default' if ff == 'default': ff = font_families().get('default') or 'default' f = self.font() if ff != 'default': f.setFamily(ff) fs = font_sizes().get('default-size') try: f.setPixelSize(int(fs)) except Exception: pass self.setFont(f) self.password_loaded.connect(self.on_password_load, type=Qt.QueuedConnection) if master_password is not None: password_db.start_load(master_password, self.password_loaded.emit) elif restart_state and 'key' in restart_state: password_db.start_load(restart_state.pop('key'), self.password_loaded.emit, pw_is_key=True) self.lastWindowClosed.connect(self.shutdown) if run_local_server: self.run_local_server(urls, new_instance, shutdown) sys.excepthook = self.on_unhandled_error self.windows = [] f = self.font() if (f.family(), f.pointSize()) == ( 'Sans Serif', 9): # Hard coded Qt settings, no user preference detected f.setPointSize(10) if 'Ubuntu' in QFontDatabase().families(): f.setFamily('Ubuntu') self.setFont(f) self.downloads = Downloads(self) self.disk_cache = create_favicon_cache() self.key_filter = KeyFilter(self) self.installEventFilter(self.key_filter)