Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不调用setSizeCon()的情况下动态调整QIcon的大小_C++_Qt_Svg_Pyqt4_Autoresize - Fatal编程技术网

C++ 在不调用setSizeCon()的情况下动态调整QIcon的大小

C++ 在不调用setSizeCon()的情况下动态调整QIcon的大小,c++,qt,svg,pyqt4,autoresize,C++,Qt,Svg,Pyqt4,Autoresize,我目前正在努力解决一个容易解决的问题。许多小部件支持某种类型的QSizePolicy。这包括QPushbutton。在我的例子中,网格布局中有多个按钮,所有按钮的垂直和水平调整大小的QSizePolicy都设置为扩展。这导致根据网格布局所属的小部件的大小调整按钮大小的nead结果 问题来自Qt中图标的处理方式。QIcon没有QSizePolicy属性(或者至少我在Qt4的官方文档中找不到关于和的属性)。唯一的方法似乎是使用setIconSize(),在这里您可以给出图标的最大大小。此外,还必须手

我目前正在努力解决一个容易解决的问题。许多小部件支持某种类型的QSizePolicy。这包括QPushbutton。在我的例子中,网格布局中有多个按钮,所有按钮的垂直和水平调整大小的QSizePolicy都设置为扩展。这导致根据网格布局所属的小部件的大小调整按钮大小的nead结果

问题来自Qt中图标的处理方式。QIcon没有QSizePolicy属性(或者至少我在Qt4的官方文档中找不到关于和的属性)。唯一的方法似乎是使用setIconSize(),在这里您可以给出图标的最大大小。此外,还必须手动实现一个关于如何更新大小的例程。在这种情况下,它将是(这里的抽象书写)icon.size==button.size常量,其中常量是某种预定义的因子(>=0)。为所选图标预定义各种大小(QICON列表)也是可能的,但仍然不是一个好选项(请阅读下面的原因)

这似乎有点过分了,特别是因为QPushbutton支持QSizePolicy,开发人员根本不需要在这个部门进行修补,除非他/她想要进行一些特殊的大小调整。另外,这与对可在QIcon中使用的SVG文件的支持相矛盾,因为我们知道,SVG=vector graphics=您可以随意拉伸这些文件,而不会降低质量

有没有人知道一种简单的方法可以做到这一点,而无需添加额外的偶数手柄来调整大小、提供所选图标的比例列表或将大小限制为最大大小

PS:我也研究了QPixmap——仍然存在同样的问题

编辑:
我忘了提到一种方法,我找到了如何做我想做的事情(但是结果没有我想要的那么漂亮)-使用
QPushbutton
的样式表中的image属性。但是,这不会创建图标!如果不需要真正的图标,只需使用一个绘制的按钮,那么使用此属性可以在调整大小方面具有极大的灵活性,特别是在使用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_())
其结果是:

图标的最大大小受
png
作为
QIcon
输入的大小限制。如果将
svg
用作
QIcon
的输入,图标的缩放大小将不受限制。然而,Windows7似乎不支持svg图标,但Ubuntu支持svg图标


如果向按钮添加标签,则需要扩展上面的代码。此外,如果需要,还可以将标签的字体大小缩放到按钮大小。

对C++中的工作人员。非常感谢

按钮的大小

#ifndef PUSHBUTTONIMAGEAUTOMATICRESIZE_H
#define PUSHBUTTONIMAGEAUTOMATICRESIZE_H

#include <QPushButton>

class PushButtonIconAutoResize : public QPushButton
{
    Q_OBJECT

public:
    PushButtonIconAutoResize(const QString &text, QWidget *parent=0);
    ~PushButtonIconAutoResize();

private:
    void paintEvent(QPaintEvent *event);

    int pad;
    int minSize;
};

#endif // PUSHBUTTONIMAGEAUTOMATICRESIZE_H
#如果NDEF按钮图像自动调整#
#定义按钮图像自动调整大小
#包括
类按钮自动大小:公共QPushButton
{
Q_对象
公众:
PushButtonIconAutoResize(常量QString&text,QWidget*parent=0);
~PushButtonIconAutoResize();
私人:
无效油漆事件(QPaintEvent*事件);
int pad;
int minSize;
};
#endif//pushbuttonImageAutomaticallize\u H
按钮niconautoresize.cpp

#include "pushbuttoniconautoresize.h"

#include <QSize>
#include <QSizePolicy>
#include <QStylePainter>
#include <QStyleOptionButton>
#include <QtGlobal>

PushButtonIconAutoResize::PushButtonIconAutoResize(const QString &text, QWidget *parent)
    : QPushButton(text, parent)
{
    pad = 4;
    minSize = 8;

    this->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding));
}

PushButtonIconAutoResize::~PushButtonIconAutoResize()
{

}

void PushButtonIconAutoResize::paintEvent( QPaintEvent *event )
{
    QStylePainter painter(this);

    QStyleOptionButton opt;
    this->initStyleOption(&opt);

    QRect r = opt.rect;

    int h = r.height();
    int w = r.width();
    int iconSize = qMax(qMin(h, w) - 2 * this->pad, this->minSize);

    opt.iconSize = QSize(iconSize, iconSize);

    painter.drawControl(QStyle::CE_PushButton, opt);
}
#包括“pushbuttoniconautoresize.h”
#包括
#包括
#包括
#包括
#包括
PushButtonConautoreSize::PushButtonConautoreSize(常量QString&text,QWidget*父项)
:QPushButton(文本,父级)
{
pad=4;
minSize=8;
这->设置izepolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding));
}
PushButtonNiconautoreSize::~PushButtonNiconautoreSize()
{
}
无效按钮自动大小::paintEvent(QPaintEvent*event)
{
画家(本);
QSTYLEOPTION按钮opt;
此->initStyleOption(&opt);
QRect r=opt.rect;
int h=r.高度();
int w=r.宽度();
int iconSize=qMax(qMin(h,w)-2*这个->垫,这个->最小尺寸);
opt.iconSize=QSize(iconSize,iconSize);
绘图控制(QStyle::CE_按钮,opt);
}

QIcon
QPixmap
没有
sizePolicy
,因为它们不是小部件,不能放在布局中。不幸的是,
QPushButton
QToolButton
无法缩放图标。您可以尝试对其中一个进行子类化,并更改
paintEvent
实现,以便缩放图标。您也可以使用
QLabel
来显示缩放的pixmap,但它不能像按钮一样工作。太复杂了。我想我会坚持使用resize事件,只需对QPushbutton使用setIconSize()来调整图标的大小。@PavelStrakhov能否请您将您的评论作为答案发布,以便我可以接受它。它准确地回答了这个问题:QIcon、QPixmap没有sizePolicy,因为它们不是小部件(所以实际上只有小部件有sizePolicy,老实说我不知道)。我只在Linux上开发,因此Windows的SVG问题并不重要(糟糕的Windows)。坦率地说,您的解决方案使用了太多的代码。LOL只需将QWidget的resizeEvent设置为调用QPushbutton的setIconSize(),图标的大小由按钮的大小定义。这真是一条单行线。我的问题主要是,是否可以在不编写任何额外事件处理的情况下执行此操作。这更像是一个“这个功能是从盒子里出来的吗?”之类的问题。我可以用paintEvent和resizeEvent来完成,这根本不是问题所在。还是谢谢你的意见@坦率地说,你的问题用了太多的词:P.本来可以更合作的