- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在努力解决一个应该很容易解决的问题。许多小部件支持某种QSizePolicy。这包括 QPushbutton。在我的例子中,我在网格布局中有多个按钮,所有这些按钮都将用于垂直和水平调整大小的 QSizePolicy 设置为扩展。这会导致根据网格布局所属的小部件的大小调整按钮大小的不良结果。
问题来自 Qt 中图标的处理方式。 QIcon 没有 QSizePolicy 属性(或者至少我无法在 Qt4 的官方文档中找到关于 QIcon 和 QAbstractButton 的属性)。唯一的方法似乎是使用 setIconSize(),您可以在其中提供图标的最大尺寸。此外,必须手动实现一个关于如何更新尺寸的例程。在这种情况下,它将是(此处抽象写作)icon.size == button.size-CONSTANT,其中 CONSTANT 是某种预定义因子 (>= 0)。为所选图标预定义各种尺寸(QIcons 列表)也是可能的,但仍然不是一个好的选择(阅读下面的原因)。
这似乎有点矫枉过正,特别是因为 QPushbutton 支持 QSizePolicy 并且开发人员根本不需要修补这个部门,除非他/她想要进行一些特殊的调整大小。这也与 QIcon 中支持 SVG 文件的支持相矛盾,因为众所周知,SVG = vector 图形 = 你可以随意拉伸(stretch)它们而不会降低质量。
有没有人知道一种简单的方法来做到这一点,而无需添加额外的偶数 handle 来调整大小、提供所选图标的比例列表或将大小限制为最大大小?
PS:我也研究了 QPixmap - 仍然存在相同的问题。
编辑:我忘了提到一种方法,我发现了如何做我想做的事(但结果并不像我希望的那样漂亮)——在 QPushbutton 的样式表中使用 image 属性
。但是,这不会创建图标!如果一个人并不真的需要一个真正的图标并且可以只使用一个绘制的按钮,那么使用这个属性可以在调整大小方面提供巨大的灵 active ,尤其是在使用 SVG 时。
最佳答案
子类化 QPushButton
,正如@Pavel 在评论中所建议的,似乎是解决您的问题的合理选择。下面我提供了一个简单的示例,展示了如何在 PySide
中完成此操作。
import sys
from PySide import QtGui, QtCore
class myContainter(QtGui.QWidget):
def __init__(self, parent=None):
super(myContainter, self).__init__(parent)
icon = QtGui.QIcon('process-stop.png')
grid = QtGui.QGridLayout()
for i in range(3):
button = myPushButton()
button.setIcon(icon)
grid.addWidget(button, i, 0)
grid.setRowStretch(i, i)
self.setLayout(grid)
class myPushButton(QtGui.QPushButton):
def __init__(self, label=None, parent=None):
super(myPushButton, self).__init__(label, parent)
self.pad = 4 # padding between the icon and the button frame
self.minSize = 8 # minimum size of the icon
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Expanding)
self.setSizePolicy(sizePolicy)
def paintEvent(self, event):
qp = QtGui.QPainter()
qp.begin(self)
#---- get default style ----
opt = QtGui.QStyleOptionButton()
self.initStyleOption(opt)
#---- scale icon to button size ----
Rect = opt.rect
h = Rect.height()
w = Rect.width()
iconSize = max(min(h, w) - 2 * self.pad, self.minSize)
opt.iconSize = QtCore.QSize(iconSize, iconSize)
#---- draw button ----
self.style().drawControl(QtGui.QStyle.CE_PushButton, opt, qp, self)
qp.end()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
instance = myContainter()
instance.show()
sys.exit(app.exec_())
结果是:
图标的最大尺寸受 QIcon
中用作输入的 png
尺寸的限制。如果 svg
用作 QIcon
的输入,则图标的缩放比例将不受大小限制。不过svg图标在windows7好像不支持,但是在ubuntu中是有的。
如果将标签添加到按钮,则需要扩展上面的代码。此外,如果需要,还可以将标签的字体大小缩放到按钮大小。
关于c++ - 在不调用 setSizeIcon() 的情况下动态调整 QIcon 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31742194/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!