【问题标题】:How can I create a QPushButton with a custom (triangular) shape in Qt 5.5?如何在 Qt 5.5 中创建具有自定义(三角形)形状的 QPushButton?
【发布时间】:2015-09-10 07:32:40
【问题描述】:

如何在 Qt 中创建三角形按钮?执行此操作的最简单方法是什么?我使用设计器来创建按钮而不是代码。

另外,我在某处读到,只要按钮的框架仍然是矩形,形状可能会发生变化,但我希望框架也能根据形状进行调整。我怎样才能做到这一点?

更多细节:我想将许多小的三角形按钮彼此相邻放置,并且每隔一个三角形翻转一次。每个三角形按钮都有自己的功能等(不接受重叠边框)。谁能给我一个描述性解释我应该如何处理这个问题?

【问题讨论】:

标签: c++ qt user-interface shape qpushbutton


【解决方案1】:

QWidget 上的几何图形始终是矩形。

可以创建一个 QPushButton 衍生物,覆盖它的paintevent,并考虑到它的邻居等做一些讨厌的绘画,但这真的很痛苦......

使用 QGraphicsView、QGraphicsScene 并添加适当的 QGraphicsItem(可能是 QGraphicsPolygonItem?)、添加它们并使用它们的信号/插槽或为您的目的创建派生类要容易得多。

覆盖鼠标事件以识别点击并不难,您甚至可以使用 QStyleSheets 让“按钮”看起来像是被按下了。

【讨论】:

  • 小部件的几何形状是一个矩形,但这实际上只是一个边界矩形。您可以定义任何所需的可见几何图形,以及任何事件敏感几何图形。矩形小部件可以让事件通过透明部分。关于唯一的“问题”是布局,需要固定定位或此类小部件的自定义布局。
  • 但是,如果我使用 QGraphicsItem,每个小三角形都需要一个边界矩形,对吗?显然,矩形将穿过相邻的三角形。我想要每个小三角形的单独功能。有什么办法可以绕过boundingrect?
  • @Outsmash:边界矩形只是一个返回 QGraphicsPolygonItem 范围的方法,并不意味着整个边界矩形就是您的按钮区域。您有 mousepressevent、mousereleaseevent、mousemoveevent 和一个名为“contains(QPoint)”的方法,用于查看鼠标位置是否在三角形内。
  • 谢谢!我设法创造了它。我覆盖了形状函数以匹配创建的多边形。我从 QGraphicsItem 创建了一个子类,并使用该子类创建了三个三角形。类定义有一个 mousepressedevent,它有“update();”。我有几个按钮(在图形视图之外)将 QColor 变量更改为相应的颜色,并且子类中的绘制函数有一个画笔变量,可以根据 QColor 变量更改它的颜色。当我在我的应用程序中单击一个三角形时,所有三角形都会改变颜色。如何分离功能?
  • paintevent 始终运行,因为无论您是否点击它都没有关系。油漆事件描绘了一切。因此,如果您更改所有三角形的paintevent中使用的变量,当然所有三角形都将更改后的变量作为颜色。相反,您可以将颜色保存到特定三角形实例的成员中。
猜你喜欢
  • 1970-01-01
  • 2012-11-06
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多