Отображение QActions в QWidgets

QActions великолепны, потому что их можно разрабатывать и управлять в одном месте, а затем отображать и взаимодействовать с ними в QMenus, QToolBars и, теоретически, с любым QWidget (в конце концов, каждый QWidget имеет функцию addAction ()). Кроме того, они удобны, потому что ими можно управлять в дизайнере (мне нужно сохранить большую часть моего интерфейса в дизайнере, чтобы люди могли его настраивать).

Однако у меня возникли проблемы: \

Я хочу просто отобразить некоторые действия (может быть, со значками, текстом и т. Д.) В группе. Есть несколько способов сделать это.

  1. Использование QToolBar: это могло бы быть идеально, потому что QToolBar уже имеет множество параметров конфигурации (значки, текст и т. Д.). К сожалению, я не могу добавить QToolBars к чему-либо, кроме главного окна (при использовании дизайнера). Я могу сделать это программно, но тогда панель инструментов также должна быть заполнена кодом (бесполезно).

  2. Использование обычного QWidget: какое-то время я пробовал это безуспешно. У меня не только проблемы с добавлением действий в QWidgets в конструкторе, но даже когда я добавляю их программно, я не могу их отобразить (я пробовал установить contextMenuPolicy на ActionsContextMenu).

Есть ли у кого-нибудь предложения относительно того, какой из этих путей может привести к чему-то гибкому (полезные параметры для настройки), но также доступному от дизайнера?

Спасибо!


person WestleyArgentum    schedule 21.08.2012    source источник


Ответы (1)


Итак, правда в том, что класс QToolBar просто не был представлен как виджет для дизайнера. После загрузки у вас будет полный доступ к нему. Есть 2 относительно простых решения вашей проблемы - в зависимости от того, как часто вам нужно это делать.

1. Взломайте файл пользовательского интерфейса

  1. Если вы создаете файл пользовательского интерфейса, перетащите в него новый пустой QWidget.
  2. Сохраните файл на диск
  3. Откройте его в текстовом редакторе и измените класс QWidget на QToolBar
  4. Повторно откройте в дизайнере, теперь у вас есть QToolBar в вашем UI-файле, с которым можно работать.

Если вы делаете это только время от времени - это неплохой способ.

2: Создайте подключаемый модуль QToolBar Designer

Немного более длинный способ сделать это (но лучше, если вы часто его используете) - просто предоставить QToolBar самому дизайнеру. Единственное, что немного раздражает в этом, - это то, что вы не можете перемещать его с помощью перетаскивания ... но что бы то ни было, вы все равно можете использовать его, вставлять макеты и все такое.

В основном я имею дело с PyQt, так что плагин будет выглядеть в PyQt именно так, но вы можете прочитать стандартные документы о том, как это сделать на C ++.

#!/usr/bin/python

''' Auto-generated ui widget plugin '''

from PyQt4.QtDesigner import QPyDesignerCustomWidgetPlugin
from PyQt4.QtGui import QIcon
from PyQt4.QtGui import QToolBar as WidgetClass

class QToolBarPlugin( QPyDesignerCustomWidgetPlugin ):
    def __init__( self, parent = None ):
        super(QToolBarPlugin, self).__init__( parent )

        self.initialized = False

    def initialize( self, core ):
        if ( self.initialized ):
            return

        self.initialized = True

    def isInitialized( self ):
        return self.initialized

    def createWidget( self, parent ):
        return WidgetClass(parent)

    def name( self ):
        if ( hasattr( WidgetClass, '__designer_name__' ) ):
            return WidgetClass.__designer_name__
        return WidgetClass.__name__

    def group( self ):
        if ( hasattr( WidgetClass, '__designer_group__' ) ):
            return WidgetClass.__designer_group__
        return 'ProjexUI'

    def icon( self ):
        if ( hasattr( WidgetClass, '__designer_icon__' ) ):
            return QIcon(WidgetClass.__designer_icon__)
        return QIcon()

    def toolTip( self ):
        if ( hasattr( WidgetClass, '__designer_tooltip__' ) ):
            return WidgetClass.__designer_tooltip__
        elif ( hasattr( WidgetClass, '__doc__' ) ):
            return str(WidgetClass.__doc__)
        return ''

    def whatsThis( self ):
        return ''

    def isContainer( self ):
        if ( hasattr( WidgetClass, '__designer_container__' ) ):
            return WidgetClass.__designer_container__
        return False

    def includeFile( self ):
        return 'PyQt4.QtGui'

    def domXml( self ):
        if ( hasattr( WidgetClass, '__designer_xml__' ) ):
            return WidgetClass.__designer_xml__

        return '<widget class="QToolBar" name="toolbar"/>'
person Eric Hulser    schedule 22.08.2012