QToolBar大小和与隐藏操作的对齐方式

2024-03-29 09:41:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我将工具栏添加到小部件中,并动态隐藏操作(它们也用于上下文菜单)。我在对齐/尺寸方面遇到了一些问题。在下面的图片中,测试1是“正确的”,我希望其他两个只有“C”按钮,右对齐(如测试3,但没有多余的左空格)。你知道吗

enter image description here

代码显示了我的尝试。测试2只是在动作A和B上使用.setVisible(False),而测试3则使用相同的方法,在左侧添加两个空的QLabel(如果我只添加一个),C不会右对齐。看起来QToolBar至少需要3个按钮之类的。你知道吗

你知道怎么解决吗?你知道吗

#!/usr/bin/env python

from PyQt4.QtGui import *
import sys

class MainWindow(QMainWindow):

  def __init__(self):
    super(QMainWindow, self).__init__()

    stylesheet = 'QToolButton{padding: 0; margin: 0} QToolBar{border: 1px solid black}'

    layout = QVBoxLayout()

    a = QAction('A', self)
    b = QAction('B', self)
    c = QAction('C', self)
    toolbar = QToolBar()
    toolbar.addAction(a)
    toolbar.addAction(b)
    toolbar.addAction(c)
    toolbar.setStyleSheet(stylesheet)
    hbox = QHBoxLayout()
    hbox.addWidget(QLabel('Test 1'))
    hbox.addStretch(1)
    hbox.addWidget(toolbar)
    group = QGroupBox()
    group.setLayout(hbox)
    layout.addWidget(group)

    a = QAction('A', self)
    b = QAction('B', self)
    c = QAction('C', self)
    toolbar = QToolBar()
    toolbar.addAction(a)
    toolbar.addAction(b)
    toolbar.addAction(c)
    a.setVisible(False)
    b.setVisible(False)
    toolbar.setStyleSheet(stylesheet)
    hbox = QHBoxLayout()
    hbox.addWidget(QLabel('Test 2'))
    hbox.addStretch(1)
    hbox.addWidget(toolbar)
    group = QGroupBox()
    group.setLayout(hbox)
    layout.addWidget(group)

    a = QAction('A', self)
    b = QAction('B', self)
    c = QAction('C', self)
    toolbar = QToolBar()
    toolbar.addWidget(QLabel(''))
    toolbar.addWidget(QLabel(''))
    toolbar.addAction(a)
    toolbar.addAction(b)
    toolbar.addAction(c)
    a.setVisible(False)
    b.setVisible(False)
    toolbar.setStyleSheet(stylesheet)
    hbox = QHBoxLayout()
    hbox.addWidget(QLabel('Test 3'))
    hbox.addStretch(1)
    hbox.addWidget(toolbar)
    group = QGroupBox()
    group.setLayout(hbox)
    layout.addWidget(group)

    layout.addStretch(1)

    widget = QWidget()
    widget.setLayout(layout)

    self.setCentralWidget(widget)

    self.show()

app = QApplication(sys.argv)
win = MainWindow()
sys.exit(app.exec_())

Tags: selffalsegrouplayouttoolbarstylesheetaddactionaddwidget
1条回答
网友
1楼 · 发布于 2024-03-29 09:41:02

要在QToolbar中动态隐藏动作,不能对动作使用setVisible(False),因为它只会从视图中“隐藏”动作,但按钮本身仍然存在,这就是为什么会有额外的空白。即使动作是隐藏的,隐藏对象中仍然存在填充,这会给您不需要的空白空间。类似地,当您添加空的QLabels时,这个“隐藏”小部件也会留下空白,因为小部件的物理区域仍然存在。你知道吗

考虑到这一点,解决方案是使用removeAction()QToolbar中删除操作。这样,实际对象将从布局中删除,因此没有空白。下面的示例演示了如何使用处理程序在QToolbar中添加和删除操作。您可以使用.actions()检查Qtoolbar中有哪些对象,并且根据要删除的操作,您只需将其传递给removeAction()。当没有更多的操作要添加或删除时,我将由您来实现错误处理。你知道吗

enter image description here

from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super(QMainWindow, self).__init__()

        self.stylesheet = 'QToolButton{padding: 0; margin: 0} QToolBar{border: 1px solid black}'

        self.main_layout = QGridLayout()
        self.layout = QVBoxLayout()

        self.a = QAction('A', self)
        self.b = QAction('B', self)
        self.c = QAction('C', self)

        self.action_table = {1: self.a,
                             2: self.b,
                             3: self.c
        }

        self.test1_toolbar = QToolBar()
        self.test1_toolbar.addAction(self.a)
        self.test1_toolbar.addAction(self.b)
        self.test1_toolbar.addAction(self.c)
        self.test1_toolbar.setStyleSheet(self.stylesheet)
        self.test1_hbox = QHBoxLayout()
        self.test1_hbox.addWidget(QLabel('Test 1'))
        self.test1_hbox.addStretch(1)
        self.test1_hbox.addWidget(self.test1_toolbar)
        self.test1_group = QGroupBox()
        self.test1_group.setLayout(self.test1_hbox)
        self.layout.addWidget(self.test1_group)

        self.test2_toolbar = QToolBar()
        self.test2_toolbar.addAction(self.a)
        self.test2_toolbar.addAction(self.b)
        self.test2_toolbar.addAction(self.c)
        self.test2_toolbar.setStyleSheet(self.stylesheet)
        self.test2_add_button = QPushButton('Add')
        self.test2_add_button.clicked.connect(self.test2_add_action)
        self.test2_remove_button = QPushButton('Remove')
        self.test2_remove_button.clicked.connect(self.test2_remove_action)
        self.test2_hbox = QHBoxLayout()
        self.test2_hbox.addWidget(QLabel('Test 2'))
        self.test2_hbox.addStretch(1)
        self.test2_hbox.addWidget(self.test2_toolbar)
        self.test2_group = QGroupBox()
        self.test2_group.setLayout(self.test2_hbox)

        self.layout.addWidget(self.test2_group)

        self.test3_toolbar = QToolBar()
        self.test3_toolbar.addAction(self.a)
        self.test3_toolbar.addAction(self.b)
        self.test3_toolbar.addAction(self.c)
        self.test3_toolbar.setStyleSheet(self.stylesheet)
        self.test3_hbox = QHBoxLayout()
        self.test3_hbox.addWidget(QLabel('Test 3'))
        self.test3_hbox.addStretch(1)
        self.test3_hbox.addWidget(self.test3_toolbar)
        self.test3_group = QGroupBox()
        self.test3_group.setLayout(self.test3_hbox)
        self.layout.addWidget(self.test3_group)

        self.layout.addStretch(1)

        self.widget = QWidget()

        self.main_layout.addLayout(self.layout,0,0,1,1)
        self.main_layout.addWidget(self.test2_add_button,0,1,1,1)
        self.main_layout.addWidget(self.test2_remove_button,0,2,1,1)
        self.widget.setLayout(self.main_layout)
        self.setCentralWidget(self.widget)
        self.show()

    def test2_add_action(self):
        objects = len(self.test2_toolbar.actions())
        self.test2_toolbar.addAction(self.action_table[objects + 1])

    def test2_remove_action(self):
        objects = len(self.test2_toolbar.actions())
        self.test2_toolbar.removeAction(self.action_table[objects])

app = QApplication(sys.argv)
win = MainWindow()
sys.exit(app.exec_())

相关问题 更多 >