带有不需要的框架的 QTabBar 下的小部件

Posted

技术标签:

【中文标题】带有不需要的框架的 QTabBar 下的小部件【英文标题】:Widget under a QTabBar with unwanted frame 【发布时间】:2011-05-30 21:22:03 【问题描述】:

我对 QTabBar/QTabWidget 有疑问。这是我的程序现在的样子,使用 QTabBar:

如你所见,QTabBar 和它下面的 QScrollArea 之间有一条难看的线。这条线是 QScrollArea 框架的一部分,我不能简单地去掉它,因为其他三个边都需要它。我意识到我可以使用 QTabWidget,但是我必须为每个选项卡创建一个小部件,这在此处是不可行的:QScrollArea 的内容根据所选选项卡而变化,但只有一个 QScrollArea 小部件。 (每次创建新标签时都复制它会导致它自己的问题。)

那么有没有人知道一种方法: (i) 告诉 QScrollArea 绘制一个没有顶线的框架;或 (ii) 对 QTabWidget 中的每个选项卡使用相同的小部件?

更新 3 有关另一种方法,请参阅下面的答案。

Update 1我已经实现了zvezdi的建议,难看的线消失了:

这是一个改进。但这是不对的。查看滚动条和边框之间的间隙。右边是两个像素而不是一个;在底部,它是 三个 像素。 QScrollArea 边框和 mainWidget 边框之间的右侧间隙太大了一个像素。这是由于 QTabWidget 的边框样式,我正在失去理智试图改变它。如果我说:

MyTabWidget -> setStyleSheet ("QTabWidget::pane  margin: 0px,0px,0px,0px ") ;

然后边距似乎是正确的,但边框消失了:

如果我说:

MyTabWidget -> setStyleSheet ("QTabWidget::pane  "
  " margin: 0px,0px,0px,0px;"
  " border: 1px solid darkgray;"
  "") ;

然后我几乎回到了我开始的地方:

如果我尝试通过以下方式解决此问题:

ApplicationTabWidget -> setStyleSheet ("QTabWidget::pane  "
"   margin: 0px,0px,0px,0px;"
" border: 1px solid darkgray;"
" border-top: 0px;"
      "") ;

然后我又因为痛苦而被嘲笑:

更新 2 如果我忘记了 setStyleSheet 而只是打开 documentMode,这就是我得到的:

请有人告诉我我很愚蠢,并且有一个非常简单的解决方案。

【问题讨论】:

【参考方案1】:

如果我认为这不是真的,您说“QScrollArea 的内容根据所选选项卡而变化”很好,您的意思是滚动区域内的小部件内容发生变化,那么您可以试试这个:

在 QTabWidget 中创建尽可能多的 QScrollArea 对象,但只有一个,例如 QTextEdit,您将在每个滚动区域中显示它,并且在标签更改时哪些内容将更改(旧标签的 takeWidget() QScrollArea & setWidget() 在新标签的 QScrollArea)

我不知道您是如何设计代码的,但要尝试我的建议,您的代码应该围绕 QScrollArea 内的小部件设计,而不是 QScrollArea 本身。

【讨论】:

这看起来很有希望!我不能完全这样做,因为我有子类 QScrollArea (所以内容确实发生了变化)。但我会尝试使用虚拟小部件创建每个选项卡,并将子类 QScrollArea 移动到当前选项卡的虚拟小部件中。 我已经实施了您的建议,这绝对是一个改进。但是还是不对!我用很多截图更新了我的问题。 查看我的新答案以了解另一种方法。【参考方案2】:

除非我误会,如果您通过将frameShape 设置为NoFrame 来关闭QScrollArea 的边框,则标签小部件的边框线仍然位于您想要它们的侧面和底部。

【讨论】:

是的,如果它是一个 QTabWidget。但如果它是 QTabBar 则不会。我不能使用 QTabWidget,因为我只有一个要显示的小部件。【参考方案3】:

我尝试了另一种方法:使用QTabBar,如第一个屏幕截图所示,然后更改MyScrollArea 的样式(很明显,回想起来):

MyScrollArea -> setStyleSheet ("QScrollArea "
  "border: 1px solid #898C95;"
  "border-top: 0px;"
  " ") ;

这是结果:

几乎是对的!存在三个问题: - 两个滚动条交叉处的小方块缺少其底部边框(但如果我单击滚动条、调整窗口大小或主窗口失去焦点,它就会被绘制); - 颜色#898C95 是硬编码的,所以如果用户更改样式,它就不会正确。但是如果我省略了border 样式,那么整个边框都会被涂成白色。有没有办法查询样式的当前边框颜色? - 最严重的是,左侧断点小部件的背景颜色不再是白色了。

但我想我已经浪费了足够多的时间了!我会坚持这个解决方案,除非有人可以提出其他尝试。

【讨论】:

以上是关于带有不需要的框架的 QTabBar 下的小部件的主要内容,如果未能解决你的问题,请参考以下文章

带有一个选项卡的 QTabBar 太宽

如何检测按下的鼠标何时进入不同框架中的小部件

pyQt4 QTabWidget setMovable 使用自定义 QTabBar 崩溃

私人JavaScript小部件

Qt4:从 QDockedWidget 的子类访问 QtDesigner 创建的小部件

Flutter/Dart:我的小部件树中可以有多个带有状态的小部件吗?