3

QAction 很棒,因为可以在一个地方设计和管理,然后在 QMenus、QToolBars 以及理论上任何 QWidget 中显示和交互(毕竟每个 QWidget 都有一个 addAction() 函数)。此外,它们很方便,因为它们可以在设计器中进行操作(我需要将大部分界面保留在设计器中,以便人们可以调整它)。

但是我遇到了问题:\

我想要做的只是在一个组中显示一些动作(可能带有图标和文本等)。有几种方法可以做到这一点。

  1. 使用 QToolBar:这可能是完美的,因为 QToolBar 已经有一堆配置选项(图标、文本等)。不幸的是,我似乎无法将 QToolBars 添加到主窗口以外的东西(使用设计器时)。我可以以编程方式完成,但是工具栏也必须在代码中填充(不好)。

  2. 使用常规的 QWidget:我已经尝试了一段时间,但完全没有成功。我不仅在设计器中向 QWidgets 添加操作时遇到问题,而且即使我以编程方式添加它们也无法显示它们(我尝试将 contextMenuPolicy 设置为 ActionsContextMenu)。

有没有人对这些路径中的哪一个可能导致一些灵活的东西(有用的调整选项)但也可以从设计师那里获得任何建议?

谢谢!

4

1 回答 1

1

所以,事情的真相是 QToolBar 类并没有作为一个小部件暴露给设计师。加载后,您可以完全访问它。您的问题有 2 个相对简单的解决方案 - 取决于您需要多久执行一次。

1:破解 UI 文件

  1. 如果您创建一个 UI 文件,请将一个新的空白 QWidget 拖入其中。
  2. 将文件保存到磁盘
  3. 使用文本编辑器打开它并将 QWidget 类更改为 QToolBar
  4. 在设计器中重新打开,您现在在 UI 文件中有一个 QToolBar 可以使用。

如果您只是偶尔这样做 - 这不是一个糟糕的方法。

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"/>'
于 2012-08-22T00:53:32.863 回答