将QToolBar放在QWidget而不是QMainWindow中

时间:2018-08-09 12:50:25

标签: python pyqt pyqt4 qmainwindow qtoolbar

我试图将QToolBar放置在QWidget的布局上,而不是QMainWindow。在QMainWindow和QWidget上工作正常,但是当我尝试首先将其添加到布局上时,情况并非如此。难道我做错了什么?可能吗?这是我的代码:

from PyQt4 import QtGui, QtCore
import sys


img = '../../Images/logo.png'


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)


    mainWin = QtGui.QMainWindow()    

    widget = QtGui.QWidget()    
    hLayout = QtGui.QHBoxLayout()

    '''ToolBar On main Window '''    

    basicToolBar = mainWin.addToolBar('Basic')
    basicToolBar.addAction(QtGui.QAction('Test', mainWin))
#    basicToolBar.addAction(QtGui.QAction(QtGui.QIcon(img), 'Test', mainWin))

#    mainWin.show()


    '''ToolBar On Widget '''

    # Case 1: Set widget as parent
#    widgetToolBar = QtGui.QToolBar(widget)
#    widgetToolBar.addAction(QtGui.QAction('Test', widget))
#    widgetToolBar.addAction(QtGui.QAction(QtGui.QIcon(img), QtGui.QAction('Test', widget))

    # Case 2: Set toolBat on a layout
    widgetToolBar = QtGui.QToolBar()
    widgetToolBar.addAction(QtGui.QAction('Test', None))
#   widgetToolBar.addAction(QtGui.QAction(QtGui.QIcon(img), 'Test', None))    
    hLayout.addWidget(widgetToolBar)  
    widget.setLayout(hLayout)

    widget.show()

    # Run 
    sys.exit(app.exec_())

2 个答案:

答案 0 :(得分:1)

由于QMainWindow具有特殊的布局,因此QToolBar只能位于QMainWindow中。

因此您可以使用辅助QMainWindow而不出现问题,如下所示:

from PyQt4 import QtCore, QtGui


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.tabwidget = QtGui.QTabWidget()
        self.setCentralWidget(self.tabwidget)
        for name in ("tab1", "tab2", "tab3"):
            self.create_widgets(name)

    def create_widgets(self, name):
        w = QtGui.QMainWindow()
        self.tabwidget.addTab(w, name)
        basicToolBar = w.addToolBar('Basic')
        basicToolBar.addAction('Test')
        basicToolBar.addAction(QtGui.QIcon("home.png"), 'Test')
        tab = QtGui.QTabWidget()
        w.setCentralWidget(tab)
        for i in range(10):
            tab.addTab(QtGui.QWidget(), "tab-{}".format(i))


if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

enter image description here

答案 1 :(得分:0)

嗯,您阅读过QToolBar的说明吗? http://doc.qt.io/qt-5/qtoolbar.html#details 我认为,如果您的Object不是QMainWindow的子级,它将不会像这样工作。该文档说:

  

当QToolBar不是QMainWindow的子级时,它将失去使用使用addWidget()添加到工具栏的小部件填充扩展弹出窗口的功能。请使用通过继承QWidgetAction并实现QWidgetAction :: createWidget()而创建的窗口小部件动作。