QIcon没有正确设置QPushButton

时间:2018-03-27 10:06:33

标签: qt

我有一个qt应用程序来设置QPushButton的图标。代码如下:

widget.h:

 class Widget : public QWidget
 {
     Q_OBJECT

 public:
    explicit Widget(QWidget *parent = 0);
~Widget();

 private:
     Ui::Widget *ui;
 };

widget.cpp:

 Widget::Widget(QWidget *parent) :
 QWidget(parent),
 ui(new Ui::Widget)
 {
  ui->setupUi(this);

   QImage img(":/sample");
   QPixmap scaled = QPixmap::fromImage(img).scaled( QSize(ui->pushButton->size().width(),ui->pushButton->size().height()), Qt::KeepAspectRatioByExpanding );
   QIcon icon(scaled);
   ui->pushButton->setIconSize(QSize(ui->pushButton->size().width(),ui->pushButton->size().height()));
   ui->pushButton->setIcon(icon);
 }

我在ui文件上有按钮。但是图标没有完全覆盖在按钮上。我的按钮大小为(100,100)。我附上了结果截图:

enter image description here

2 个答案:

答案 0 :(得分:0)

尝试传递Qt::IgnoreAspectRatio作为scaled的最后一个参数,并查看结果是否符合您的需求。如果它没有,也许图像应该是平方的(即相同的宽度和高度)。

答案 1 :(得分:0)

您的方法存在的问题是您要在构造函数本身中设置按钮的图标。由于您的代码取决于按钮的大小,因此这是一种不好的方法。原因是,在构造函数执行结束之前,大小是不固定的,因此最终会导致意外结果。解决方案是在主窗口的调整大小事件期间设置图标的大小,该方法甚至允许调整按钮的大小是否在运行时发生变化。

首先安装事件过滤器(在构造函数中复制此行)

this->installEventFilter(this);  

现在重新实现一个名为eventFilter的功能

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    Q_UNUSED(watched)
    if(event->type() == QEvent::Resize){
        SetIcon();
    }
    return false;
}

SetIcon()的定义如下

void Widget::SetIcon()
{
    // Set the following variables according to your need
    QString IconPath = /*Path_of_your_icon*/;
    QPushButton *button = /*Your_Pushbutton*/;
    int Margin = /*Margin*/;

    button->setIcon(QIcon(QPixmap(IconPath)));
    QSize size;
    int width = button->height() - Margin ;
    int height = button->width() - Margin ;
    size.setHeight(height);
    size.setWidth(width);
    button->setIconSize(size);

}