Arhn - архитектура программирования

QToolbar ведет себя странно с QAction и &(амперсанд)

Согласно документам, QAction использует один & для обозначения мнемонического сочетания клавиш, но когда я использовал его на QToolbar, это не сработало. Затем я попробовал &&, который сработал, и мнемоника появилась с ярлыком, работающим нормально, и подчеркивание появилось правильно. Но согласно документам && используется для отображения одного & в метке.

Неверный код

from PySide.QtGui import *
from PySide.QtCore import *
import sys
#####Custom edited example
class Main(QMainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.actionNotification = QAction(self)
        self.actionNotification.setCheckable(True)
        self.actionNotification.setChecked(False)
        self.actionNotification.setEnabled(True)
        self.actionNotification.setAutoRepeat(True)
        self.actionNotification.setVisible(True)
        self.actionNotification.setIconVisibleInMenu(False)
        self.actionNotification.setObjectName("actionNotification")
        self.toolBar = QToolBar(self)
        self.toolBar.setLayoutDirection(Qt.RightToLeft)
        self.toolBar.setStyleSheet("")
        self.toolBar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        self.toolBar.setObjectName("toolBar")
        self.toolBar.addAction(self.actionNotification)
        self.actionNotification.setText("&Notification") #the problem lies here
        self.actionNotification.setToolTip(
            QApplication.translate("MainWindow", "Click to see new notifications", None,
                                   QApplication.UnicodeUTF8))
if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = Main()
    form.show()
    app.exec_()

Рабочий код

from PySide.QtGui import *
from PySide.QtCore import *
import sys
#####Custom edited example
class Main(QMainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.actionNotification = QAction(self)
        self.actionNotification.setCheckable(True)
        self.actionNotification.setChecked(False)
        self.actionNotification.setEnabled(True)
        self.actionNotification.setAutoRepeat(True)
        self.actionNotification.setVisible(True)
        self.actionNotification.setIconVisibleInMenu(False)
        self.actionNotification.setObjectName("actionNotification")
        self.toolBar = QToolBar(self)
        self.toolBar.setLayoutDirection(Qt.RightToLeft)
        self.toolBar.setStyleSheet("")
        self.toolBar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        self.toolBar.setObjectName("toolBar")
        self.toolBar.addAction(self.actionNotification)
        self.actionNotification.setText("&&Notification") #this works
        self.actionNotification.setToolTip(
            QApplication.translate("MainWindow", "Click to see new notifications", None,
                                   QApplication.UnicodeUTF8))
if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = Main()
    form.show()
    app.exec_()

Быстрый вопрос в IRC (люди там были действительно полезны) подтвердил мне, что это была проблема qt, так как это была та же проблема в pyqt4, и что QAction отлично работает с QMenu, и проблема существует только для QToolBar

Я подумал о том, чтобы задать этот вопрос здесь, чтобы провести расширенное обсуждение и, если возможно, узнать, почему он так себя ведет.

tl;dr: что делать с этим странным поведением QToolBar? Я хотел бы знать, почему он так себя ведет.

Любая помощь или предложение было бы действительно здорово

система: Debian, python2.7, PySide-1.1

30.07.2015

  • Это не специфично ни для pyqt, ни для Qt4 - его также можно воспроизвести на С++ с использованием Qt 5.3. Скорее всего, это ошибка - нечто подобное уже сообщалось ранее (bugreports.qt.io/browse/ QTBUG-2229), но закрыт как не входящий в область действия. Если вы хотите использовать один и тот же QAction в строке меню и на панели инструментов, вероятно, все, что вы можете сделать, это использовать отдельные QAction для панели инструментов и строки меню, а во избежание дублирования кода просто вызовите trigger() слот другого QAction в одном из обоих. 30.07.2015
  • @Андреас, спасибо за эту информацию!! 30.07.2015

Ответы:


1

Чтобы обойти эту ошибку, вы можете позвонить QAction.setIconText("&Foo"), и мнемоника будет соблюдена.

10.09.2018
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..