在QTWidgets中显示操作

时间:2012-08-21 23:22:59

标签: c++ qt qt-creator qt-designer

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

但我遇到了问题:\

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

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

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

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

    谢谢!

1 个答案:

答案 0 :(得分:1)

所以,问题的真相是QToolBar类并没有作为设计器的小部件公开。加载后,您可以完全访问它。您的问题有两个相对简单的解决方案 - 取决于您需要执行的频率。

1:破解UI文件

  1. 如果您创建了一个UI文件,请将一个新的空白QWidget拖入其中。
  2. 将文件保存到磁盘
  3. 使用文本编辑器打开它并将QWidget类更改为QToolBar
  4. 在设计器中重新打开,您现在可以在UI文件中使用QToolBar。
  5. 如果你偶尔只做一次 - 这不是一个坏的方法。

    2:制作QToolBar Designer插件

    稍微长一点的方法(但如果你经常使用它会更好)就是自己将QToolBar暴露给Designer。对于这个问题,唯一有点烦人的是你不能通过拖放来移动它......但无论如何,你仍然可以使用它并放入布局和所有东西。

    我主要处理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"/>'