QLineEdit 中自动缩放的开关背景图像

An auto-scaled on-off background image in a QLineEdit

我有几个 QLineEdit 小部件需要在某些代码更改时显示和消失它们的背景,并且需要这些背景在小部件大小更改时也重新缩放。

我对 Qt 网站上的所有 Whosebug 和文档感到迷茫。我的主要困惑是我如何只使用我制作的 paintEvent 函数注册特定的小部件。

在伪代码中,我被引导相信我的自动缩放背景图像想法需要 QPainter 和 QPixmap 的某种组合:

void MyGUI::paintEvent(QWidget mywidget, string path){
  QPainter painter(mywidget);

  QPixmap _mypix(path);

  int widgetHeight = mywidget.height();
  int imageHeight = _mypix.height();
  float imageratio = _mypix.width()/_mypix.height();
  if(imageHeight > widgetHeight){
    painter.drawPixmap(0,0,imageratio*widgetHeight, widgetHeight, _mypix);
  }
  else{ painter.drawPixmap(0,0,_mypix.width(), _mypix.height(), _mypix);}
}

然后在主UI中,我想根据情况调用上面的函数来打开和关闭这个背景图片。不过,当图像打开时,我希望它根据上述功能调整大小(又名取决于它的小部件的高度,而不是主要的 GUI 高度):

Blah blah constructor stuff
{
  ui->setupUi(this);
  
  paintEvent(ui->widget1, "path\to\background1.png");
  paintEvent(ui->widget2, "path\to\background2.png");
  
  connect(this,SIGNAL(MaybeTurnOffBackground()),this,SLOT(TurnOffBackgroundSometimes(bool)));
}

void MyGUI::TurnOffBackgroundSometimes(bool backgroundOn)
{
  if(backgroundOn)
  {
    paintEvent(ui->widget1, "path\to\background1.png");
    paintEvent(ui->widget2, "path\to\background2.png");
  }
  else{
    //something that removes the images
  }
}

希望它足够清楚。我不知道如何让这种行为发生。我觉得使用 paintEvent 业务会使事情变得过于复杂,但我不确定替代方案是什么。

解决了我自己的问题。最终完全在样式表中完成。我不知道我反对使用图像而不是 background-image 的哲学是什么,除了担心它会与输入到 QLineEdit 中的文本交互不良。值得庆幸的是,这不是一个问题,文本在整个框中获得最大的 Z 高度,因此图像仍会出现在它后面。

一些答案指定您需要边框,例如“边框:1px 纯白色”。我先测试了边框,然后没有,它的功能是一样的,所以我把边框去掉了。 YMMV.

#myWidget1{
    image: url(":/main/assets/myAsset1.png");
    image-position: left;
    padding: 5px;
}

关于 on-off 功能...我实际上已经解决了这个问题。我刚刚创建了一个自定义 属性,并根据需要在 SLOTS 中将其关闭和打开。

样式表:

#myWidget1{
    background:rgba(125,0,0,55);
}

#myWidget1[status="active"]{
    image: url(":/main/assets/myAsset1.png");
    image-position: left;
    padding: 5px;
}

插槽中的示例代码:

if(active){
  ui->myWidget1->setProperty("status","active");
}
else{
  ui->myWidget1->setProperty("status","notactive");
}

好处是我实际上不必在样式表中定义“notactive”采用什么样式。它只是默认为基线样式。