def __init__(self, updater): super().__init__(QEvent.User) self._updater = updater self._result = None self._semaphore = QSemaphore(1) if QCoreApplication.instance().thread() != QThread.currentThread(): self._semaphore.acquire()
def show_browser(self): ''' Show the currently loaded web page in a window. Useful for debugging. ''' if getattr(QCoreApplication.instance(), 'headless', False): raise RuntimeError('Cannot show browser when running in a headless Qt application') view = BrowserView(self.page) view.exec_()
def __init__(self, gui_enabled=True): # Start Qt if EventLoop.qt is None: EventLoop.qt = QCoreApplication.instance() or QApplication( []) if gui_enabled else QCoreApplication([]) asyncframes.AbstractEventLoop.__init__(self) QObject.__init__(self) self.moveToThread(QThread.currentThread())
def __init__(self, *args, **kwargs): QDialog.__init__(self, *args) self.setupUi(self) desktop = QCoreApplication.instance().desktop() geom = desktop.availableGeometry(self) nh, nw = max(550, geom.height()-25), max(700, geom.width()-10) nh = min(self.height(), nh) nw = min(self.width(), nw) self.resize(nw, nh)
def show_browser(self): ''' Show the currently loaded web page in a window. Useful for debugging. ''' if getattr(QCoreApplication.instance(), 'headless', False): raise RuntimeError( 'Cannot show browser when running in a headless Qt application' ) view = BrowserView(self.page) view.exec_()
def parsed(self): if not self.renderer.aborted and self.renderer.lrf is not None: width, height = self.renderer.lrf.device_info.width, \ self.renderer.lrf.device_info.height hdelta = self.tool_bar.height() + 3 s = QScrollBar(self) scrollbar_adjust = min(s.width(), s.height()) self.graphics_view.resize_for(width + scrollbar_adjust, height + scrollbar_adjust) desktop = QCoreApplication.instance().desktop() screen_height = desktop.availableGeometry(self).height() - 25 height = min(screen_height, height + hdelta + scrollbar_adjust) self.resize(width + scrollbar_adjust, height) self.setWindowTitle(self.renderer.lrf.metadata.title + ' - ' + __appname__) self.document_title = self.renderer.lrf.metadata.title if self.opts.profile: import cProfile lrf = self.renderer.lrf cProfile.runctx('self.document.render(lrf)', globals(), locals(), lrf.metadata.title + '.stats') print('Stats written to', self.renderer.lrf.metadata.title + '.stats') else: start = time.time() self.document.render(self.renderer.lrf) print('Layout time:', time.time() - start, 'seconds') self.renderer.lrf = None self.graphics_view.setScene(self.document) self.graphics_view.show() self.spin_box.setRange(1, self.document.num_of_pages) self.slider.setRange(1, self.document.num_of_pages) self.spin_box.setSuffix(' of %d' % (self.document.num_of_pages, )) self.spin_box.updateGeometry() self.stack.setCurrentIndex(0) self.graphics_view.setFocus(Qt.OtherFocusReason) elif self.renderer.exception is not None: exception = self.renderer.exception print('Error rendering document', file=sys.stderr) print(exception, file=sys.stderr) print(self.renderer.formatted_traceback, file=sys.stderr) msg = '<p><b>%s</b>: ' % (exception.__class__.__name__, ) + str( str(exception), 'utf8', 'replace') + '</p>' msg += '<p>Failed to render document</p>' msg += '<p>Detailed <b>traceback</b>:<pre>' msg += self.renderer.formatted_traceback + '</pre>' d = ConversionErrorDialog(self, 'Error while rendering file', msg) d.exec_()
def available_height(): desktop = QCoreApplication.instance().desktop() return desktop.availableGeometry().height()
def available_heights(): desktop = QCoreApplication.instance().desktop() return map(lambda x: x.height(), map(desktop.availableGeometry, range(desktop.screenCount())))
def __init__(self, parent, dbspec, ids, db): import re, cStringIO from calibre import prints as info from PyQt5.uic import compileUi QDialog.__init__(self, parent) self.setupUi(self) self.dbspec, self.ids = dbspec, ids # Display the number of books we've been passed self.count.setText(unicode(self.count.text()).format(len(ids))) # Display the last-used title self.title.setText( dynamic.get('catalog_last_used_title', _('My books'))) self.fmts, self.widgets = [], [] for plugin in catalog_plugins(): if plugin.name in config['disabled_plugins']: continue name = plugin.name.lower().replace(' ', '_') if getattr(plugin, 'plugin_path', None) is None: try: catalog_widget = importlib.import_module( 'calibre.gui2.catalog.' + name) pw = catalog_widget.PluginWidget() pw.initialize(name, db) pw.ICON = I('forward.png') self.widgets.append(pw) [ self.fmts.append( [file_type.upper(), pw.sync_enabled, pw]) for file_type in plugin.file_types ] except ImportError: info("ImportError initializing %s" % name) continue else: # Load dynamic tab form = os.path.join(plugin.resources_path, '%s.ui' % name) klass = os.path.join(plugin.resources_path, '%s.py' % name) compiled_form = os.path.join(plugin.resources_path, '%s_ui.py' % name) if os.path.exists(form) and os.path.exists(klass): # info("Adding widget for user-installed Catalog plugin %s" % plugin.name) # Compile the .ui form provided in plugin.zip if not os.path.exists(compiled_form): # info('\tCompiling form', form) buf = cStringIO.StringIO() compileUi(form, buf) dat = buf.getvalue() dat = re.compile( r'QtGui.QApplication.translate\(.+?,\s+"(.+?)(?<!\\)",.+?\)', re.DOTALL).sub(r'_("\1")', dat) open(compiled_form, 'wb').write(dat) # Import the dynamic PluginWidget() from .py file provided in plugin.zip try: sys.path.insert(0, plugin.resources_path) catalog_widget = importlib.import_module(name) pw = catalog_widget.PluginWidget() pw.initialize(name) pw.ICON = I('forward.png') self.widgets.append(pw) [ self.fmts.append( [file_type.upper(), pw.sync_enabled, pw]) for file_type in plugin.file_types ] except ImportError: info("ImportError with %s" % name) continue finally: sys.path.remove(plugin.resources_path) else: info("No dynamic tab resources found for %s" % name) self.widgets = sorted(self.widgets, cmp=lambda x, y: cmp(x.TITLE, y.TITLE)) # Generate a sorted list of installed catalog formats/sync_enabled pairs fmts = sorted([x[0] for x in self.fmts]) self.sync_enabled_formats = [] for fmt in self.fmts: if fmt[1]: self.sync_enabled_formats.append(fmt[0]) # Callbacks when format, title changes self.format.currentIndexChanged.connect(self.format_changed) self.format.currentIndexChanged.connect(self.settings_changed) self.title.editingFinished.connect(self.settings_changed) # Add the installed catalog format list to the format QComboBox self.format.blockSignals(True) self.format.addItems(fmts) pref = dynamic.get('catalog_preferred_format', 'CSV') idx = self.format.findText(pref) if idx > -1: self.format.setCurrentIndex(idx) self.format.blockSignals(False) if self.sync.isEnabled(): self.sync.setChecked(dynamic.get('catalog_sync_to_device', True)) self.add_to_library.setChecked( dynamic.get('catalog_add_to_library', True)) self.format.currentIndexChanged.connect(self.show_plugin_tab) self.buttonBox.button(self.buttonBox.Apply).clicked.connect(self.apply) self.buttonBox.button(self.buttonBox.Help).clicked.connect(self.help) self.show_plugin_tab(None) geom = dynamic.get('catalog_window_geom', None) if geom is not None: self.restoreGeometry(bytes(geom)) else: self.resize(self.sizeHint()) d = QCoreApplication.instance().desktop() g = d.availableGeometry(d.screenNumber(self)) self.setMaximumWidth(g.width() - 50) self.setMaximumHeight(g.height() - 50)
def __init__(self, gui, row, toggle_shortcut): self.is_pane = gprefs.get('quickview_is_pane', False) if not self.is_pane: QDialog.__init__(self, gui, flags=Qt.WindowType.Widget) else: QDialog.__init__(self, gui) Ui_Quickview.__init__(self) self.setupUi(self) self.isClosed = False self.current_book = None self.closed_by_button = False if self.is_pane: self.main_grid_layout.setContentsMargins(0, 0, 0, 0) else: self.setWindowIcon(self.windowIcon()) self.books_table_column_widths = None try: self.books_table_column_widths = \ gprefs.get('quickview_dialog_books_table_widths', None) if not self.is_pane: geom = gprefs.get('quickview_dialog_geometry', None) if geom: QApplication.instance().safe_restore_geometry( self, QByteArray(geom)) except: pass self.view = gui.library_view self.db = self.view.model().db self.gui = gui self.is_closed = False self.current_book_id = None # the db id of the book used to fill the lh pane self.current_column = None # current logical column in books list self.current_key = None # current lookup key in books list self.last_search = None self.no_valid_items = False self.follow_library_view = True self.apply_vls.setCheckState( Qt.CheckState.Checked if gprefs['qv_respects_vls'] else Qt. CheckState.Unchecked) self.apply_vls.stateChanged.connect(self.vl_box_changed) self.fm = self.db.field_metadata self.items.setSelectionMode( QAbstractItemView.SelectionMode.SingleSelection) self.items.currentTextChanged.connect(self.item_selected) self.items.setProperty('highlight_current_item', 150) self.items.itemDoubleClicked.connect(self.item_doubleclicked) self.items.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.items.customContextMenuRequested.connect( self.show_item_context_menu) focus_filter = WidgetFocusFilter(self.items) focus_filter.focus_entered_signal.connect(self.focus_entered) self.items.installEventFilter(focus_filter) self.tab_pressed_signal.connect(self.tab_pressed) return_filter = BooksTableFilter(self.books_table) return_filter.return_pressed_signal.connect(self.return_pressed) self.books_table.installEventFilter(return_filter) focus_filter = WidgetFocusFilter(self.books_table) focus_filter.focus_entered_signal.connect(self.focus_entered) self.books_table.installEventFilter(focus_filter) self.close_button.clicked.connect(self.close_button_clicked) self.refresh_button.clicked.connect(self.refill) self.tab_order_widgets = [ self.items, self.books_table, self.lock_qv, self.dock_button, self.refresh_button, self.close_button ] for idx, widget in enumerate(self.tab_order_widgets): widget.installEventFilter( WidgetTabFilter(widget, idx, self.tab_pressed_signal)) self.books_table.setSelectionBehavior( QAbstractItemView.SelectionBehavior.SelectRows) self.books_table.setSelectionMode( QAbstractItemView.SelectionMode.SingleSelection) self.books_table.setProperty('highlight_current_item', 150) # Set up the books table columns self.add_columns_to_widget() self.books_table_header_height = self.books_table.height() self.books_table.cellDoubleClicked.connect(self.book_doubleclicked) self.books_table.currentCellChanged.connect( self.books_table_cell_changed) self.books_table.cellClicked.connect( self.books_table_set_search_string) self.books_table.cellActivated.connect( self.books_table_set_search_string) self.books_table.sortByColumn(0, Qt.SortOrder.AscendingOrder) # get the standard table row height. Do this here because calling # resizeRowsToContents can word wrap long cell contents, creating # double-high rows self.books_table.setRowCount(1) self.books_table.setItem(0, 0, TableItem('A', '')) self.books_table.resizeRowsToContents() self.books_table_row_height = self.books_table.rowHeight(0) self.books_table.setRowCount(0) # Add the data self.refresh(row) self.view.clicked.connect(self.slave) self.view.selectionModel().currentColumnChanged.connect( self.column_slave) QCoreApplication.instance().aboutToQuit.connect(self.save_state) self.view.model().new_bookdisplay_data.connect(self.book_was_changed) self.close_button.setDefault(False) self.close_button_tooltip = _( 'The Quickview shortcut ({0}) shows/hides the Quickview panel') if self.is_pane: self.dock_button.setText(_('Undock')) self.dock_button.setToolTip( _('Show the Quickview panel in its own floating window')) self.dock_button.setIcon(QIcon(I('arrow-up.png'))) # Remove the ampersands from the buttons because shortcuts exist. self.lock_qv.setText(_('Lock Quickview contents')) self.refresh_button.setText(_('Refresh')) self.gui.quickview_splitter.add_quickview_dialog(self) self.close_button.setVisible(False) else: self.dock_button.setToolTip( _('Embed the quickview panel into the main calibre window')) self.dock_button.setIcon(QIcon(I('arrow-down.png'))) self.set_focus() self.books_table.horizontalHeader().sectionResized.connect( self.section_resized) self.dock_button.clicked.connect(self.show_as_pane_changed) self.view.model().search_done.connect(self.check_for_no_items) # Enable the refresh button only when QV is locked self.refresh_button.setEnabled(False) self.lock_qv.stateChanged.connect(self.lock_qv_changed) self.view_icon = QIcon(I('view.png')) self.view_plugin = self.gui.iactions['View'] self.edit_metadata_icon = QIcon(I('edit_input.png')) self.quickview_icon = QIcon(I('quickview.png')) self.select_book_icon = QIcon(I('library.png')) self.search_icon = QIcon(I('search.png')) self.books_table.setContextMenuPolicy( Qt.ContextMenuPolicy.CustomContextMenu) self.books_table.customContextMenuRequested.connect( self.show_context_menu) # Add the quickview toggle as a shortcut for the close button # Don't add it if it identical to the current &X shortcut because that # breaks &X if (not self.is_pane and toggle_shortcut and self.close_button.shortcut() != toggle_shortcut): toggle_sc = QShortcut(toggle_shortcut, self.close_button) toggle_sc.activated.connect(lambda: self.close_button_clicked()) toggle_sc.setEnabled(True) self.close_button.setToolTip( _('Alternate shortcut: ') + toggle_shortcut.toString())
def instance(cls): return QCoreApplication.instance()
def __init__(self, parent, view, row, link_delegate): QDialog.__init__(self, parent) self.normal_brush = QBrush(Qt.white) self.marked_brush = QBrush(Qt.lightGray) self.marked = None self.gui = parent self.splitter = QSplitter(self) self._l = l = QVBoxLayout(self) self.setLayout(l) l.addWidget(self.splitter) self.cover = CoverView(self, show_size=gprefs['bd_overlay_cover_size']) self.cover.resizeEvent = self.cover_view_resized self.cover.cover_changed.connect(self.cover_changed) self.cover_pixmap = None self.cover.sizeHint = self.details_size_hint self.splitter.addWidget(self.cover) self.details = Details(parent.book_details.book_info, self) self.details.anchor_clicked.connect(self.on_link_clicked) self.link_delegate = link_delegate self.details.setAttribute(Qt.WA_OpaquePaintEvent, False) palette = self.details.palette() self.details.setAcceptDrops(False) palette.setBrush(QPalette.Base, Qt.transparent) self.details.setPalette(palette) self.c = QWidget(self) self.c.l = l2 = QGridLayout(self.c) l2.setContentsMargins(0, 0, 0, 0) self.c.setLayout(l2) l2.addWidget(self.details, 0, 0, 1, -1) self.splitter.addWidget(self.c) self.fit_cover = QCheckBox(_('Fit &cover within view'), self) self.fit_cover.setChecked( gprefs.get('book_info_dialog_fit_cover', True)) self.hl = hl = QHBoxLayout() hl.setContentsMargins(0, 0, 0, 0) l2.addLayout(hl, l2.rowCount(), 0, 1, -1) hl.addWidget(self.fit_cover), hl.addStretch() self.clabel = QLabel( '<div style="text-align: right"><a href="calibre:conf" title="{}" style="text-decoration: none">{}</a>' .format(_('Configure this view'), _('Configure'))) self.clabel.linkActivated.connect(self.configure) hl.addWidget(self.clabel) self.previous_button = QPushButton(QIcon(I('previous.png')), _('&Previous'), self) self.previous_button.clicked.connect(self.previous) l2.addWidget(self.previous_button, l2.rowCount(), 0) self.next_button = QPushButton(QIcon(I('next.png')), _('&Next'), self) self.next_button.clicked.connect(self.next) l2.addWidget(self.next_button, l2.rowCount() - 1, 1) self.view = view self.current_row = None self.refresh(row) self.view.model().new_bookdisplay_data.connect(self.slave) self.fit_cover.stateChanged.connect(self.toggle_cover_fit) self.ns = QShortcut(QKeySequence('Alt+Right'), self) self.ns.activated.connect(self.next) self.ps = QShortcut(QKeySequence('Alt+Left'), self) self.ps.activated.connect(self.previous) self.next_button.setToolTip( _('Next [%s]') % unicode_type(self.ns.key().toString(QKeySequence.NativeText))) self.previous_button.setToolTip( _('Previous [%s]') % unicode_type(self.ps.key().toString(QKeySequence.NativeText))) geom = QCoreApplication.instance().desktop().availableGeometry(self) screen_height = geom.height() - 100 screen_width = geom.width() - 100 self.resize(max(int(screen_width / 2), 700), screen_height) saved_layout = gprefs.get('book_info_dialog_layout', None) if saved_layout is not None: try: self.restoreGeometry(saved_layout[0]) self.splitter.restoreState(saved_layout[1]) except Exception: pass
def __init__(self, parent, view, row, link_delegate): QDialog.__init__(self, parent) self.normal_brush = QBrush(Qt.white) self.marked_brush = QBrush(Qt.lightGray) self.marked = None self.gui = parent self.splitter = QSplitter(self) self._l = l = QVBoxLayout(self) self.setLayout(l) l.addWidget(self.splitter) self.cover = CoverView(self) self.cover.resizeEvent = self.cover_view_resized self.cover.cover_changed.connect(self.cover_changed) self.cover_pixmap = None self.cover.sizeHint = self.details_size_hint self.splitter.addWidget(self.cover) self.details = Details(parent.book_details.book_info, self) self.details.page().setLinkDelegationPolicy( self.details.page().DelegateAllLinks) self.details.linkClicked.connect(self.link_clicked) s = self.details.page().settings() s.setAttribute(s.JavascriptEnabled, False) self.css = css() self.link_delegate = link_delegate self.details.setAttribute(Qt.WA_OpaquePaintEvent, False) palette = self.details.palette() self.details.setAcceptDrops(False) palette.setBrush(QPalette.Base, Qt.transparent) self.details.page().setPalette(palette) self.c = QWidget(self) self.c.l = l2 = QGridLayout(self.c) self.c.setLayout(l2) l2.addWidget(self.details, 0, 0, 1, -1) self.splitter.addWidget(self.c) self.fit_cover = QCheckBox(_('Fit &cover within view'), self) self.fit_cover.setChecked( gprefs.get('book_info_dialog_fit_cover', True)) l2.addWidget(self.fit_cover, l2.rowCount(), 0, 1, -1) self.previous_button = QPushButton(QIcon(I('previous.png')), _('&Previous'), self) self.previous_button.clicked.connect(self.previous) l2.addWidget(self.previous_button, l2.rowCount(), 0) self.next_button = QPushButton(QIcon(I('next.png')), _('&Next'), self) self.next_button.clicked.connect(self.next) l2.addWidget(self.next_button, l2.rowCount() - 1, 1) self.view = view self.current_row = None self.refresh(row) self.view.model().new_bookdisplay_data.connect(self.slave) self.fit_cover.stateChanged.connect(self.toggle_cover_fit) self.ns = QShortcut(QKeySequence('Alt+Right'), self) self.ns.activated.connect(self.next) self.ps = QShortcut(QKeySequence('Alt+Left'), self) self.ps.activated.connect(self.previous) self.next_button.setToolTip( _('Next [%s]') % unicode(self.ns.key().toString(QKeySequence.NativeText))) self.previous_button.setToolTip( _('Previous [%s]') % unicode(self.ps.key().toString(QKeySequence.NativeText))) geom = QCoreApplication.instance().desktop().availableGeometry(self) screen_height = geom.height() - 100 screen_width = geom.width() - 100 self.resize(max(int(screen_width / 2), 700), screen_height) saved_layout = gprefs.get('book_info_dialog_layout', None) if saved_layout is not None: try: self.restoreGeometry(saved_layout[0]) self.splitter.restoreState(saved_layout[1]) except Exception: pass
def __init__(self, gui, view, row): QDialog.__init__(self, gui, flags=Qt.Window) Ui_Quickview.__init__(self) self.setupUi(self) self.isClosed = False self.books_table_column_widths = None try: self.books_table_column_widths = \ gprefs.get('quickview_dialog_books_table_widths', None) geom = gprefs.get('quickview_dialog_geometry', bytearray('')) self.restoreGeometry(QByteArray(geom)) except: pass # Remove the help button from the window title bar icon = self.windowIcon() self.setWindowFlags(self.windowFlags() & (~Qt.WindowContextHelpButtonHint)) self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint) self.setWindowIcon(icon) self.db = view.model().db self.view = view self.gui = gui self.is_closed = False self.current_book_id = None self.current_key = None self.last_search = None self.current_column = None self.current_item = None self.no_valid_items = False column_positions = self.view.get_state()['column_positions'] column_order = ['title', 'authors', 'series'] column_order.sort(key=lambda col: column_positions[col]) self.title_column = column_order.index('title') self.author_column = column_order.index('authors') self.series_column = column_order.index('series') self.items.setSelectionMode(QAbstractItemView.SingleSelection) self.items.currentTextChanged.connect(self.item_selected) # Set up the books table columns self.books_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.books_table.setSelectionMode(QAbstractItemView.SingleSelection) self.books_table.setColumnCount(3) t = QTableWidgetItem(_('Title')) self.books_table.setHorizontalHeaderItem(self.title_column, t) t = QTableWidgetItem(_('Authors')) self.books_table.setHorizontalHeaderItem(self.author_column, t) t = QTableWidgetItem(ngettext("Series", 'Series', 1)) self.books_table.setHorizontalHeaderItem(self.series_column, t) self.books_table_header_height = self.books_table.height() self.books_table.cellDoubleClicked.connect(self.book_doubleclicked) self.books_table.sortByColumn(self.title_column, Qt.AscendingOrder) # get the standard table row height. Do this here because calling # resizeRowsToContents can word wrap long cell contents, creating # double-high rows self.books_table.setRowCount(1) self.books_table.setItem(0, 0, TableItem('A', '')) self.books_table.resizeRowsToContents() self.books_table_row_height = self.books_table.rowHeight(0) self.books_table.setRowCount(0) # Add the data self.refresh(row) self.view.clicked.connect(self.slave) self.change_quickview_column.connect(self.slave) QCoreApplication.instance().aboutToQuit.connect(self.save_state) self.search_button.clicked.connect(self.do_search) view.model().new_bookdisplay_data.connect(self.book_was_changed) close_button = self.buttonBox.button(QDialogButtonBox.Close) close_button.setAutoDefault(False)
def __init__(self, parent=None): super().__init__(parent) self._timer = QBasicTimer() QCoreApplication.instance().aboutToQuit.connect(self.saveIfNecessary)
def available_width(): desktop = QCoreApplication.instance().desktop() return desktop.availableGeometry().width()
def sizeHint(self): desktop = QCoreApplication.instance().desktop() geom = desktop.availableGeometry(self) nh, nw = max(300, geom.height() - 50), max(400, geom.width() - 70) return QSize(nw, nh)
def no_more_jobs(self): if self.is_running: self.stop() QCoreApplication.instance().alert(self, 5000)
def __init__(self, gui, row): self.is_pane = gprefs.get('quickview_is_pane', False) if not self.is_pane: QDialog.__init__(self, gui, flags=Qt.Widget) else: QDialog.__init__(self, gui) Ui_Quickview.__init__(self) self.setupUi(self) self.isClosed = False self.current_book = None self.closed_by_button = False if self.is_pane: self.main_grid_layout.setContentsMargins(0, 0, 0, 0) self.books_table_column_widths = None try: self.books_table_column_widths = \ gprefs.get('quickview_dialog_books_table_widths', None) if not self.is_pane: geom = gprefs.get('quickview_dialog_geometry', bytearray('')) self.restoreGeometry(QByteArray(geom)) except: pass if not self.is_pane: # Remove the help button from the window title bar icon = self.windowIcon() self.setWindowFlags(self.windowFlags() & (~Qt.WindowContextHelpButtonHint)) self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint) self.setWindowIcon(icon) self.view = gui.library_view self.db = self.view.model().db self.gui = gui self.is_closed = False self.current_book_id = None # the db id of the book used to fill the lh pane self.current_column = None # current logical column in books list self.current_key = None # current lookup key in books list self.last_search = None self.no_valid_items = False self.fm = self.db.field_metadata self.items.setSelectionMode(QAbstractItemView.SingleSelection) self.items.currentTextChanged.connect(self.item_selected) self.items.setProperty('highlight_current_item', 150) focus_filter = WidgetFocusFilter(self.items) focus_filter.focus_entered_signal.connect(self.focus_entered) self.items.installEventFilter(focus_filter) self.tab_pressed_signal.connect(self.tab_pressed) return_filter = BooksTableFilter(self.books_table) return_filter.return_pressed_signal.connect(self.return_pressed) self.books_table.installEventFilter(return_filter) focus_filter = WidgetFocusFilter(self.books_table) focus_filter.focus_entered_signal.connect(self.focus_entered) self.books_table.installEventFilter(focus_filter) self.close_button.clicked.connect(self.close_button_clicked) self.tab_order_widgets = [ self.items, self.books_table, self.lock_qv, self.dock_button, self.search_button, self.close_button ] for idx, widget in enumerate(self.tab_order_widgets): widget.installEventFilter( WidgetTabFilter(widget, idx, self.tab_pressed_signal)) self.books_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.books_table.setSelectionMode(QAbstractItemView.SingleSelection) self.books_table.setProperty('highlight_current_item', 150) # Set up the books table columns self.add_columns_to_widget() self.books_table_header_height = self.books_table.height() self.books_table.cellDoubleClicked.connect(self.book_doubleclicked) self.books_table.currentCellChanged.connect( self.books_table_cell_changed) self.books_table.cellClicked.connect( self.books_table_set_search_string) self.books_table.cellActivated.connect( self.books_table_set_search_string) self.books_table.sortByColumn(0, Qt.AscendingOrder) # get the standard table row height. Do this here because calling # resizeRowsToContents can word wrap long cell contents, creating # double-high rows self.books_table.setRowCount(1) self.books_table.setItem(0, 0, TableItem('A', '')) self.books_table.resizeRowsToContents() self.books_table_row_height = self.books_table.rowHeight(0) self.books_table.setRowCount(0) # Add the data self.refresh(row) self.view.clicked.connect(self.slave) self.view.selectionModel().currentColumnChanged.connect( self.column_slave) QCoreApplication.instance().aboutToQuit.connect(self.save_state) self.search_button.clicked.connect(self.do_search) self.view.model().new_bookdisplay_data.connect(self.book_was_changed) self.close_button.setDefault(False) self.close_button_tooltip = _( 'The Quickview shortcut ({0}) shows/hides the Quickview pane') self.search_button_tooltip = _( 'Search in the library view for the currently highlighted selection' ) self.search_button.setToolTip(self.search_button_tooltip) if self.is_pane: self.dock_button.setText(_('Undock')) self.dock_button.setToolTip( _('Pop up the quickview panel into its own floating window')) self.dock_button.setIcon(QIcon(I('arrow-up.png'))) self.lock_qv.setText(_('Lock Quickview contents')) self.search_button.setText(_('Search')) self.gui.quickview_splitter.add_quickview_dialog(self) self.close_button.setVisible(False) else: self.dock_button.setToolTip( _('Embed the quickview panel into the main calibre window')) self.dock_button.setIcon(QIcon(I('arrow-down.png'))) self.set_focus() self.books_table.horizontalHeader().sectionResized.connect( self.section_resized) self.dock_button.clicked.connect(self.show_as_pane_changed) self.gui.search.cleared.connect(self.indicate_no_items)
def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(795, 520) Dialog.setStyleSheet("background-color:rgb(252,253,253);") self.verticalWidget = QtWidgets.QWidget(Dialog) self.verticalWidget.setGeometry(QtCore.QRect(0, 30, 200, 490)) self.verticalWidget.setMinimumSize(QtCore.QSize(200, 490)) self.verticalWidget.setMaximumSize(QtCore.QSize(200, 490)) self.verticalWidget.setStyleSheet("background: rgb(52,56,60);\n" "") self.verticalWidget.setObjectName("verticalWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") spacerItem = QtWidgets.QSpacerItem(20, 30, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.graphicsView = QtWidgets.QGraphicsView(self.verticalWidget) self.graphicsView.setEnabled(False) self.graphicsView.setMinimumSize(QtCore.QSize(100, 100)) self.graphicsView.setMaximumSize(QtCore.QSize(100, 100)) self.graphicsView.setLayoutDirection(QtCore.Qt.LeftToRight) self.graphicsView.setAutoFillBackground(True) self.graphicsView.setStyleSheet( "background-image: url(images/bear.png);\n" "border-radius:50px;\n" "") self.graphicsView.setObjectName("graphicsView") self.verticalLayout.addWidget(self.graphicsView, 0, QtCore.Qt.AlignHCenter) self.label_3 = QtWidgets.QLabel(self.verticalWidget) self.label_3.setStyleSheet("color: rgb(255, 255, 255);\n" "font:bold;") self.label_3.setObjectName("label_3") self.verticalLayout.addWidget(self.label_3, 0, QtCore.Qt.AlignHCenter) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.verticalLayout.addItem(spacerItem1) # self.label_2 = QtWidgets.QLabel(self.verticalWidget) # self.label_2.setStyleSheet("color: rgb(242, 242, 242);") # self.label_2.setObjectName("label_2") # self.verticalLayout.addWidget(self.label_2, 0, QtCore.Qt.AlignLeft) self.recommend = QtWidgets.QPushButton(self.verticalWidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(30) sizePolicy.setHeightForWidth( self.recommend.sizePolicy().hasHeightForWidth()) self.recommend.setSizePolicy(sizePolicy) self.recommend.setMinimumSize(QtCore.QSize(190, 23)) self.recommend.setMaximumSize(QtCore.QSize(190, 16777215)) # self.recommend.setGeometry(QtCore.QRect(0, 10, 190, 30)) self.recommend.setStyleSheet("background: rgb(137,199,161);\n" "color: rgb(250,250,250);\n" "border-radius:4px;\n" "font:\"微软雅黑\";\n" "margin-left:10px;\n" "font:bold;") self.recommend.setIconSize(QtCore.QSize(8, 8)) self.recommend.setObjectName("recommend") self.recommend.clicked.connect(self.getRecommend) self.verticalLayout.addWidget(self.recommend) self.record = QtWidgets.QPushButton(self.verticalWidget) self.record.setMinimumSize(QtCore.QSize(190, 23)) self.record.setMaximumSize(QtCore.QSize(180, 16777215)) self.record.setStyleSheet("background: rgb(137,199,161);\n" "color: rgb(250,250,250);\n" "border-radius:4px;\n" "font:\"微软雅黑\";\n" "margin-left:10px;\n" "font:bold;") self.record.setObjectName("record") self.verticalLayout.addWidget(self.record) self.record.clicked.connect(self.getRecord) self.problems = QtWidgets.QPushButton(self.verticalWidget) self.problems.setMinimumSize(QtCore.QSize(190, 23)) self.problems.setMaximumSize(QtCore.QSize(190, 16777215)) self.problems.setStyleSheet("background: rgb(137,199,161);\n" "color: rgb(250,250,250);\n" "border-radius:4px;\n" "font:\"微软雅黑\";\n" "margin-left:10px;\n" "font:bold;") self.problems.setObjectName("problems") self.verticalLayout.addWidget(self.problems) self.problems.clicked.connect(self.getProblems) self.searchuser = QtWidgets.QPushButton(self.verticalWidget) self.searchuser.setMinimumSize(QtCore.QSize(190, 23)) self.searchuser.setMaximumSize(QtCore.QSize(180, 16777215)) self.searchuser.setStyleSheet("background: rgb(137,199,161);\n" "color: rgb(250,250,250);\n" "border-radius:4px;\n" "font:\"微软雅黑\";\n" "margin-left:10px;\n" "font:bold;") self.searchuser.setObjectName("searchuser") self.verticalLayout.addWidget(self.searchuser) self.searchuser.clicked.connect(self.searchUser) self.searchpro = QtWidgets.QPushButton(self.verticalWidget) self.searchpro.setMinimumSize(QtCore.QSize(190, 23)) self.searchpro.setMaximumSize(QtCore.QSize(180, 16777215)) self.searchpro.setStyleSheet("background: rgb(137,199,161);\n" "color: rgb(250,250,250);\n" "border-radius:4px;\n" "font:\"微软雅黑\";\n" "margin-left:10px;\n" "font:bold;") self.searchpro.setObjectName("searchpro") self.verticalLayout.addWidget(self.searchpro) self.searchpro.clicked.connect(self.searchPro) spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem2) spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem3) self.main = QtWidgets.QWidget(Dialog) self.main.setGeometry(QtCore.QRect(200, 30, 595, 490)) self.main.setObjectName("main") self.main.setStyleSheet("background: rgb(252,253,253);\n") self.aboutcontent = QtWidgets.QLabel(self.main) self.aboutcontent.setGeometry(QtCore.QRect(220, -130, 500, 400)) self.aboutcontent.setStyleSheet("background: rgb(252,253,253);\n" "color: black;\n" "border-radius:4px;\n" "font:bold;") self.aboutcontent.setObjectName("aboutcontent") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.main) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setGeometry(QtCore.QRect(0, 0, 595, 330)) self.verticalLayout_2.setObjectName("verticalLayout_2") self.recommendLabel = QtWidgets.QLabel(self.main) self.recommendLabel.setMaximumSize(QtCore.QSize(200, 28)) # self.recommendLabel.setGeometry(QtCore.QRect(10, 30, 200, 28)) self.recommendLabel.setStyleSheet("color: rgb(28,28,28);\n" "font: 10pt \"微软雅黑\";\n" "font:bold;") self.recommendLabel.setObjectName("label_4") self.recommendLabel.setVisible(False) self.verticalLayout_2.addWidget(self.recommendLabel, 1, QtCore.Qt.AlignHCenter) self.remindLabel = QtWidgets.QLabel(self.main) self.remindLabel.setMaximumSize(QtCore.QSize(200, 28)) self.remindLabel.setStyleSheet("color: rgb(28,28,28);\n" "font: 11pt \"微软雅黑\";\n" "font:bold;") self.remindLabel.setObjectName("label_5") self.verticalLayout_2.addWidget(self.remindLabel, 1, QtCore.Qt.AlignHCenter) self.table = QtWidgets.QTableWidget(self.main) # self.table.setGeometry(QtCore.QRect(30, 30, 400, 490)) self.table.setStyleSheet("border:1px\n" "") self.table.setStyleSheet("background: rgb(252,253,253);\n" "border:1px;\n" "") self.table.setObjectName("table") self.table.setColumnCount(0) self.table.setRowCount(0) self.verticalLayout_2.addWidget(self.table) self.table.verticalScrollBar().setStyleSheet( "background:rgb(137,199,161,25%);border:1px;width:20px;font:black;" ) self.newrecord = QtWidgets.QTableWidget(self.main) self.newrecord.setGeometry(QtCore.QRect(0, 443, 595, 100)) self.newrecord.setStyleSheet("border:1px\n" "") self.newrecord.setObjectName("newrecord") self.newrecord.setColumnCount(3) self.newrecord.setRowCount(1) self.table.setSelectionMode(QTableWidget.NoSelection) self.newrecord.setSelectionMode(QTableWidget.NoSelection) # self.verticalLayout_2.addWidget(self.newrecord) self.horizontalFrame_2 = QtWidgets.QFrame(Dialog) self.horizontalFrame_2.setGeometry(QtCore.QRect(0, 0, 795, 35)) self.horizontalFrame_2.setMinimumSize(QtCore.QSize(0, 35)) self.horizontalFrame_2.setObjectName("horizontalFrame_2") self.horizontalFrame_2.setStyleSheet("background: rgb(137,199,161);\n" "") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalFrame_2) self.horizontalLayout_2.setObjectName("horizontalLayout_2") # self.label = QtWidgets.QLabel(self.horizontalFrame_2) # self.label.setMinimumSize(QtCore.QSize(100, 0)) # self.label.setMaximumSize(QtCore.QSize(100, 20)) # self.label.setStyleSheet("font: 10pt \"华文琥珀\";\n" #"font: 11pt \"华文彩云\";\n" #"") # self.label.setObjectName("label") # self.horizontalLayout_2.addWidget(self.label, 0, QtCore.Qt.AlignVCenter) self.icon = QtWidgets.QGraphicsView(self.verticalWidget) self.icon.setEnabled(False) self.icon.setMaximumSize(QtCore.QSize(16, 16)) self.icon.setAutoFillBackground(True) self.icon.setStyleSheet("background-image: url(images/AI.png);\n" "border-radius:1px;\n") self.icon.setObjectName("graphicsView2") self.horizontalLayout_2.addWidget(self.icon, 0, QtCore.Qt.AlignLeft) spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem4) self.pushButton_2 = QtWidgets.QPushButton(self.horizontalFrame_2) self.pushButton_2.setMinimumSize(QtCore.QSize(50, 0)) self.pushButton_2.setMaximumSize(QtCore.QSize(70, 20)) self.pushButton_2.setStyleSheet( "background: rgb(250,250,250);\n" "color: rgb(137,199,161);\n" "font:bold;\n" "border-bottom: 2px solid rgb(137,199,161);\n" "border-radius: 2px;") self.pushButton_2.setObjectName("pushButton_2") self.pushButton_2.clicked.connect(QCoreApplication.instance().quit) self.horizontalLayout_2.addWidget(self.pushButton_2, 0, QtCore.Qt.AlignLeft) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog)