diff --git a/src/calibre/gui2/dialogs/edit_authors_dialog.py b/src/calibre/gui2/dialogs/edit_authors_dialog.py index 80afed8788..a05fc7b369 100644 --- a/src/calibre/gui2/dialogs/edit_authors_dialog.py +++ b/src/calibre/gui2/dialogs/edit_authors_dialog.py @@ -305,7 +305,7 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog): action_title_case.triggered.connect(self.title_case) action_capitalize.triggered.connect(self.capitalize) - m = self.au_context_menu = QMenu() + m = self.au_context_menu = QMenu(self) idx = self.table.indexAt(point) id_ = int(self.table.item(idx.row(), 0).data(Qt.UserRole)) sub = self.get_column_name(idx.column()) diff --git a/src/calibre/gui2/layout.py b/src/calibre/gui2/layout.py index 56376d9f48..ef8cb17542 100644 --- a/src/calibre/gui2/layout.py +++ b/src/calibre/gui2/layout.py @@ -215,7 +215,7 @@ class SearchBar(QFrame): # {{{ sb.setAutoRaise(True) sb.setText(_('Sort')) sb.setIcon(QIcon(I('sort.png'))) - sb.setMenu(QMenu()) + sb.setMenu(QMenu(sb)) sb.menu().aboutToShow.connect(self.populate_sort_menu) sb.setVisible(False) l.addWidget(sb) diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index d3ceb2a812..3f34dce288 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -167,9 +167,9 @@ class MetadataSingleDialogBase(QDialog): if ac is not None: ac.trigger() return QMenu.mouseReleaseEvent(self, ev) - b.m = m = Menu() + b.m = m = Menu(b) else: - b.m = m = QMenu() + b.m = m = QMenu(b) ac = m.addAction(QIcon(I('forward.png')), _('Set author sort from author')) ac2 = m.addAction(QIcon(I('back.png')), _('Set author from author sort')) ac3 = m.addAction(QIcon(I('user_profile.png')), _('Manage authors')) @@ -256,7 +256,7 @@ class MetadataSingleDialogBase(QDialog): b.setIcon(QIcon(I('edit-paste.png'))) b.clicked.connect(self.identifiers.paste_identifier) b.setPopupMode(b.DelayedPopup) - b.setMenu(QMenu()) + b.setMenu(QMenu(b)) self.update_paste_identifiers_menu() self.publisher = PublisherEdit(self) diff --git a/src/calibre/gui2/metadata/single_download.py b/src/calibre/gui2/metadata/single_download.py index d5ac5cc3a2..e540cd489b 100644 --- a/src/calibre/gui2/metadata/single_download.py +++ b/src/calibre/gui2/metadata/single_download.py @@ -827,7 +827,7 @@ class CoversView(QListView): # {{{ def show_context_menu(self, point): idx = self.currentIndex() if idx and idx.isValid() and not idx.data(Qt.UserRole): - m = QMenu() + m = QMenu(self) m.addAction(QIcon(I('view.png')), _('View this cover at full size'), self.show_cover) m.addAction(QIcon(I('edit-copy.png')), _('Copy this cover to clipboard'), self.copy_cover) m.exec_(QCursor.pos()) diff --git a/src/calibre/gui2/preferences/coloring.py b/src/calibre/gui2/preferences/coloring.py index 113de90f60..fed09e0b63 100644 --- a/src/calibre/gui2/preferences/coloring.py +++ b/src/calibre/gui2/preferences/coloring.py @@ -421,7 +421,7 @@ class RuleEditor(QDialog): # {{{ if self.rule_kind != 'color': self.remove_button = b = bb.addButton(_('&Remove icon'), bb.ActionRole) b.setIcon(QIcon(I('minus.png'))) - b.setMenu(QMenu()) + b.setMenu(QMenu(b)) b.setToolTip('

' + _('Remove a previously added icon. Note that doing so will cause rules that use it to stop working.')) self.update_remove_button() diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 0a1f5aa261..e1d2c6e4a2 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -566,7 +566,7 @@ class SavedSearchBoxMixin(object): # {{{ self.save_search_button.setToolTip('

' + _("Save current search under the name shown in the box. " "Press and hold for a pop-up options menu.") + '

') - self.save_search_button.setMenu(QMenu()) + self.save_search_button.setMenu(QMenu(self.save_search_button)) self.save_search_button.menu().addAction( QIcon(I('plus.png')), _('Create Saved search'), @@ -575,7 +575,7 @@ class SavedSearchBoxMixin(object): # {{{ QIcon(I('trash.png')), _('Delete Saved search'), self.saved_search.delete_current_search) self.save_search_button.menu().addAction( QIcon(I('search.png')), _('Manage Saved searches'), partial(self.do_saved_search_edit, None)) - self.add_saved_search_button.setMenu(QMenu()) + self.add_saved_search_button.setMenu(QMenu(self.add_saved_search_button)) self.add_saved_search_button.menu().aboutToShow.connect(self.populate_add_saved_search_menu) def populate_add_saved_search_menu(self): diff --git a/src/calibre/gui2/search_restriction_mixin.py b/src/calibre/gui2/search_restriction_mixin.py index 86b184ace4..ca1d0bddf6 100644 --- a/src/calibre/gui2/search_restriction_mixin.py +++ b/src/calibre/gui2/search_restriction_mixin.py @@ -329,7 +329,7 @@ class SearchRestrictionMixin(object): self.search_based_vl_name = None self.search_based_vl = None - self.virtual_library_menu = QMenu() + self.virtual_library_menu = QMenu(self.virtual_library) self.virtual_library.setMenu(self.virtual_library_menu) self.virtual_library_menu.aboutToShow.connect(self.virtual_library_menu_about_to_show) @@ -342,9 +342,9 @@ class SearchRestrictionMixin(object): self.search_restriction = ComboBoxWithHelp(self) self.search_restriction.setVisible(False) self.clear_vl.setText(_("(all books)")) - self.ar_menu = QMenu(_('Additional restriction')) - self.edit_menu = QMenu(_('Edit Virtual library')) - self.rm_menu = QMenu(_('Remove Virtual library')) + self.ar_menu = QMenu(_('Additional restriction'), self.virtual_library_menu) + self.edit_menu = QMenu(_('Edit Virtual library'), self.virtual_library_menu) + self.rm_menu = QMenu(_('Remove Virtual library'), self.virtual_library_menu) self.search_restriction_list_built = False def add_virtual_library(self, db, name, search): diff --git a/src/calibre/gui2/store/config/chooser/results_view.py b/src/calibre/gui2/store/config/chooser/results_view.py index 3c1a8732a7..647536b1c0 100644 --- a/src/calibre/gui2/store/config/chooser/results_view.py +++ b/src/calibre/gui2/store/config/chooser/results_view.py @@ -46,7 +46,7 @@ class ResultsView(QTreeView): plugin = self.model().get_plugin(index) - menu = QMenu() + menu = QMenu(self) ca = menu.addAction(_('Configure...'), partial(self.configure_plugin, plugin)) if not plugin.is_customizable(): ca.setEnabled(False) diff --git a/src/calibre/gui2/store/search/results_view.py b/src/calibre/gui2/store/search/results_view.py index 0bed9cee29..8fc7348493 100644 --- a/src/calibre/gui2/store/search/results_view.py +++ b/src/calibre/gui2/store/search/results_view.py @@ -64,7 +64,7 @@ class ResultsView(QTreeView): result = self.model().get_result(index) - menu = QMenu() + menu = QMenu(self) da = menu.addAction(_('Download...'), partial(self.download_requested.emit, result)) if not result.downloads: da.setEnabled(False) diff --git a/src/calibre/gui2/tag_browser/ui.py b/src/calibre/gui2/tag_browser/ui.py index 668fc2769c..89e8fdf10c 100644 --- a/src/calibre/gui2/tag_browser/ui.py +++ b/src/calibre/gui2/tag_browser/ui.py @@ -462,7 +462,7 @@ class TagBrowserBar(QWidget): # {{{ ' items, etc.' ))) b.setIcon(QIcon(I('config.png'))) - b.m = QMenu() + b.m = QMenu(b) b.setMenu(b.m) self.item_search = FindBox(parent) @@ -479,7 +479,7 @@ class TagBrowserBar(QWidget): # {{{ 'categories using syntax similar to search. For example, ' 'tags:foo will find foo in any tag, but not in authors etc. Entering ' '*foo will collapse all categories then showing only those categories ' - 'with items containing the text "foo"') + '') ac = QAction(parent) parent.addAction(ac) parent.keyboard.register_shortcut('tag browser find box', diff --git a/src/calibre/gui2/tweak_book/check.py b/src/calibre/gui2/tweak_book/check.py index b350a6c0e2..795cee8f23 100644 --- a/src/calibre/gui2/tweak_book/check.py +++ b/src/calibre/gui2/tweak_book/check.py @@ -91,7 +91,7 @@ class Check(QSplitter): self.items.clear() def context_menu(self, pos): - m = QMenu() + m = QMenu(self) if self.items.count() > 0: m.addAction(QIcon(I('edit-copy.png')), _('Copy list of errors to clipboard'), self.copy_to_clipboard) if list(m.actions()): diff --git a/src/calibre/gui2/tweak_book/editor/image.py b/src/calibre/gui2/tweak_book/editor/image.py index 6a9eb15ff3..e5e388e337 100644 --- a/src/calibre/gui2/tweak_book/editor/image.py +++ b/src/calibre/gui2/tweak_book/editor/image.py @@ -268,7 +268,7 @@ class Editor(QMainWindow): b.addSeparator() self.action_filters = ac = b.addAction(QIcon(I('filter.png')), _('Image filters')) b.widgetForAction(ac).setPopupMode(QToolButton.InstantPopup) - self.filters_menu = m = QMenu() + self.filters_menu = m = QMenu(self) ac.setMenu(m) m.addAction(_('Auto-trim image'), self.canvas.autotrim_image) m.addAction(_('Sharpen image'), self.sharpen_image) diff --git a/src/calibre/gui2/tweak_book/spell.py b/src/calibre/gui2/tweak_book/spell.py index a200f6649d..c4c3231977 100644 --- a/src/calibre/gui2/tweak_book/spell.py +++ b/src/calibre/gui2/tweak_book/spell.py @@ -865,7 +865,7 @@ class WordsView(QTableView): w = self.model().word_for_row(self.currentIndex().row()) if w is not None: a = m.addAction(_('Change %s to') % w[0]) - cm = QMenu() + cm = QMenu(self) a.setMenu(cm) cm.addAction(_('Specify replacement manually'), partial(self.change_to.emit, w, None)) cm.addSeparator() @@ -874,7 +874,7 @@ class WordsView(QTableView): m.addAction(_('Ignore/un-ignore all selected words'), self.ignore_all) a = m.addAction(_('Add/remove all selected words')) - am = QMenu() + am = QMenu(self) a.setMenu(am) for dic in sorted(dictionaries.active_user_dictionaries, key=lambda x:sort_key(x.name)): am.addAction(dic.name, partial(self.add_all.emit, dic.name))