保持 QToolbar 始终显示所有项目
Keep QToolbar showing always all items
让我们考虑以下屏幕截图:
可以看到顶部工具栏显示2行;但是要这样做,需要点击右上角的>>
(红色圈出)并一直悬停在工具栏区域,这会有点烦人。
有没有办法让工具栏的两行一直显示?
解决方法是:
- 使用布局展开 QToolBar,在私有 API 的实现中有一个名为 setExpanded() 的插槽,允许展开 QToolBar。
- 隐藏按钮,对于这种情况,它只能将大小设置为 QSize(0, 0)。
- 停用 QToolBar 的 Leave 事件,使其不会折叠。
from PyQt5 import QtCore, QtGui, QtWidgets
class ToolBar(QtWidgets.QToolBar):
def __init__(self, parent=None):
super().__init__(parent)
lay = self.findChild(QtWidgets.QLayout)
if lay is not None:
lay.setExpanded(True)
QtCore.QTimer.singleShot(0, self.on_timeout)
@QtCore.pyqtSlot()
def on_timeout(self):
button = self.findChild(QtWidgets.QToolButton, "qt_toolbar_ext_button")
if button is not None:
button.setFixedSize(0, 0)
def event(self, e):
if e.type() == QtCore.QEvent.Leave:
return True
return super().event(e)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QMainWindow()
toolbar = ToolBar()
for i in range(20):
toolbar.addAction("action{}".format(i))
w.addToolBar(QtCore.Qt.TopToolBarArea, toolbar)
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
让我们考虑以下屏幕截图:
可以看到顶部工具栏显示2行;但是要这样做,需要点击右上角的>>
(红色圈出)并一直悬停在工具栏区域,这会有点烦人。
有没有办法让工具栏的两行一直显示?
解决方法是:
- 使用布局展开 QToolBar,在私有 API 的实现中有一个名为 setExpanded() 的插槽,允许展开 QToolBar。
- 隐藏按钮,对于这种情况,它只能将大小设置为 QSize(0, 0)。
- 停用 QToolBar 的 Leave 事件,使其不会折叠。
from PyQt5 import QtCore, QtGui, QtWidgets
class ToolBar(QtWidgets.QToolBar):
def __init__(self, parent=None):
super().__init__(parent)
lay = self.findChild(QtWidgets.QLayout)
if lay is not None:
lay.setExpanded(True)
QtCore.QTimer.singleShot(0, self.on_timeout)
@QtCore.pyqtSlot()
def on_timeout(self):
button = self.findChild(QtWidgets.QToolButton, "qt_toolbar_ext_button")
if button is not None:
button.setFixedSize(0, 0)
def event(self, e):
if e.type() == QtCore.QEvent.Leave:
return True
return super().event(e)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QMainWindow()
toolbar = ToolBar()
for i in range(20):
toolbar.addAction("action{}".format(i))
w.addToolBar(QtCore.Qt.TopToolBarArea, toolbar)
w.resize(640, 480)
w.show()
sys.exit(app.exec_())