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”采用什么样式。它只是默认为基线样式。
我有几个 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”采用什么样式。它只是默认为基线样式。