QT中如何设置窗体的背景图片
qt设置背景图片

qt设置背景图⽚《⼀》/qq5823996/article/details/6851788Qt的窗⼝背景图⽚有3种⽅式设置1、QPalette p;p.setBrush();2、this->setStyleSheet("background-image:url(:/images/dl.png)");3、⽤PaintEvent,实时刷新我的问题⽐较特殊,我画了⼀个登陆窗,初始化之后输⼊⽤户名和密码登陆,如果错误,也能登陆,在主窗体有查询功能处会提⽰登陆,这个时候弹出登陆窗居然没有背景图⽚了,虽然不知道原因是什么,不过QPallete和PaintEvent都不起作⽤,setStyleSheet好使,不过问题⼜来了,在登陆窗上⾯的QLabel和QLineEdit和QPushbutton都会⾃动赋上背景图⽚,解决办法就是给他们贴上空⽩⾊QLabel::setStyleSheet("background: transparent;border:0px");使⽤setStyleSheet来设置图形界⾯的外观:QT Style Sheets是⼀个很有利的⼯具,允许定制窗⼝的外观,此外还可以⽤⼦类QStyle来完成,他的语法很⼤⽐重来源于html的CSS,但是适⽤于窗⼝概括:Style Sheets是⽂字性的设定,对于整个应⽤程序可以使⽤QApplication::setStyleSheet() 或者对应⼀个窗⼝可以使⽤QWidget::setStyleSheet(),如果好⼏个样式表在不同的层次上设定,QT将会集合所有的样式表来设定外观,这称作级串联例如:下⾯的样式表指定所有的QLineEdit应该⽤黄⾊作为他们的背景颜⾊,所有的核对框应该⽤红⾊作为他们的⽂本颜⾊01. QLineEdit { background: yellow }02. QCheckBox { color: red }复制代码对于这种定制,样式表⽐palette调⾊板更强⼤,例如使⽤QPalette::Button role来设定⼀个按钮为红⾊可能引起危险对于单独使⽤QPalette很难完成的定制,样式表可以指定样式表作⽤于当前窗⼝样式顶部,这意味这应⽤程序讲看起来尽可能的⾃然,但是任何样式表系统参数应该考虑,不像QPalette那样,样式表提供检查,如果你设定了⼀个按钮的背景颜⾊为红⾊,你应该确定在所有的平台按钮将会有⼀个红⾊的背景,除此,Qt Designer提供样式表集成环境,使得在不同的窗⼝样式中更容易看到样式表的效果此外,样式表可以⽤来为你的应⽤程序提供⼀个出众的外观,不需要使⽤⼦类QStyle,例如,可以指定任意的图⽚为单选按钮和核对按钮,来使它们出众,使⽤这个技术,也可以获得辅助的定制,这将使⽤⼏个⼦类,例如指定style hint(样式暗⽰),可以参看例⼦ Style Sheet。
pyqt5中setbackground函数参数的解释

在PyQt5 中,setBackground函数用于设置部件的背景颜色或背景图片。
这个函数可以接受多种参数,具体取决于你想要实现的效果。
以下是一些常见的参数及其解释:1.颜色:通过传递一个QColor 对象来设置背景颜色。
例如:python复制代码color = QColor("red")widget.setBackground(color)2.图片:通过传递一个QPixmap 或QIcon 对象来设置背景图片。
例如:python复制代码pixmap = QPixmap("path/to/image.png")widget.setBackground(pixmap)3.模式:如果你使用图片作为背景,可以指定图片的显示模式。
常见的模式有Qt.NoBackground、Qt.StretchPattern、Qt.TilePattern等。
例如:python复制代码widget.setBackground(pixmap, Qt.StretchPattern)4.位置:对于使用图片作为背景的情况,可以通过传递一个QPoint 来指定图片的位置。
例如:python复制代码widget.setBackground(pixmap, Qt.StretchPattern, QPoint(0, 0))5.其他属性:还可以传递其他属性来进一步定制背景效果,例如Qt.BackgroundRole来指定背景的角色(如窗口背景、控件背景等)。
记住,当使用setBackground方法时,通常需要确保部件支持背景设置。
不是所有的部件都支持背景设置,特别是那些没有明确提供背景设置的部件(如QLabel)。
在这种情况下,可能需要使用样式表(StyleSheet)来设置背景。
Qt自定义窗口之背景实现

Qt⾃定义窗⼝之背景实现前⾔Qt 要想实现好看的窗⼝就要⾃⼰绘制标题栏,此时需要屏蔽掉系统默认的标题栏并展⽰⾃定义的窗⼝(背景)本篇随笔仅仅展⽰如何创建⽆默认边框、形状为圆⾓矩形的窗⼝代码此代码⽚段贴在代码贴在构造函数内就可以1this->setGeometry(QRect(100,100,400,500)); //设置窗⼝位置和尺⼨2this->setWindowFlags(Qt::FramelessWindowHint); //设置边框(包括默认的标题栏)3this->setAutoFillBackground(true);45//添加背景图⽚6 QPixmap img("../background.jpeg");7 QPalette pal;8 pal.setBrush(this->backgroundRole(),QBrush(img));9this->setPalette(pal);1011//设置窗⼝显⽰区域12 QBitmap bmMask(this->size());13 QPainter painter(&bmMask);14 painter.fillRect(rect(),Qt::white);//填充位图矩形框(⽤⽩⾊填充)15//在位图上画圆⾓矩形(⽤⿊⾊填充)16 painter.setBrush(Qt::black);17 painter.setRenderHint(QPainter::Antialiasing);//抗锯齿化设置(你的圆⾓矩形线条会更丝滑)18 painter.drawRoundedRect(this->rect(),10,10);19//另⼀种填充⽅式20// QPainterPath paintpath;21// paintpath.setFillRule(Qt::WindingFill);22// painter.setBrush(Qt::black);23// paintpath.addRoundedRect(QRect(0, 0, this->width(), this->height()), 10, 10);24// painter.fillPath(paintpath, QBrush(Qt::black));25 setMask(bmMask);效果控件的添加就和在⼀般窗⼝上添加是⼀样的。
QT设计师使用样式表添加背景

QT设计师使⽤样式表添加背景
QT create中样式表可以⽤来设置背景图、背景颜⾊、字体⼤⼩格式颜⾊等
1、添加背景图的话需要先添加资源⽂件
右击项⽬⽂件选择添加新⽂件,再选择QT资源⽂件(QT resource file)然后建⽴。
成功建⽴资源⽂件后点开资源⽂件左下⾓有选择图⽚的,把背景图放进去选好后要按ctrl+s保存,可以选择添加前缀来区分各种图⽚。
然后在ui设计⾥右键点击要添加背景的窗⼝或部件选择改变样式表先在编辑区打上代码(如QWidge{ }QWidge表⽰你选择窗⼝或部件的基类),
在再添加资源⾥选择background-image然后选择图⽚就⾏了
如下图
设置字体背景颜⾊等直接打开样式表就⾏了不⽤添加什么⽂件,这个很简单我就不⼀⼀说说明了不会的可以在下⾯留⾔问我。
QT 屏保设置

简单总结下在嵌入式arm板中设置屏保的方法:在Qt中有二个QWSScreenSaver类这个类的定义如下定义路径qwindowsystem_qws.hclass Q_GUI_EXPORT QWSScreenSaver086 {087 public:088 virtual ~QWSScreenSaver();089 virtual void restore()=0;090 virtual bool save(int level)=0;091 };是类class QWSServerPrivate 的成员,在成类中与屏保设置相关的类成员还有QTime screensavertime;097 QTimer* screensavertimer;098 int* screensaverintervals;099 int screensavereventblocklevel;100 bool screensaverblockevents;101 bool screensaverblockevent( int index, int *screensaverinterval, bool isDown );102 QWSScreenSaver* saver;void screenSave(int level);在设置屏保的时候,Qt程序要作为服务端来运行,QWSScreenSaver中的虚函数virtual void restore()和virtual bool save(int level)都是用来重载,设置在屏保状态的处理在后面的函数中重载,设置恢复屏保的处理在前面的虚函数中执行,为了节省功耗,我在屏保状态下关掉屏幕的背光,在恢复状态下开启背光。
我用这个方法做个简单的测试,能实现屏保时间设置的动态更。
说下我这个测试的调试过程定义了个SCreenSaver类,继承自QWSScreenSaver类的定义和实现代码如下#ifndef SCREENSAVER_H#define SCREENSAVER_H#include <QWidget>#include <QWSServer>class ScreenSaver : public QWSScreenSaver{public:ScreenSaver();virtual void restore();virtual bool save(int level);private:int freq;int dutycycle;public slots:void ScreenSaver_parameter_changed(int);};#endif // SCREENSAVER_H实现文件如下#include "screensaver.h"#include <QDebug>#include <QtCore>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/stat.h>#include <fcntl.h>#define IOCTL_FREQUENCY 0#define IOCTL_DUTYCYCLE 1static int fd;ScreenSaver::ScreenSaver():QWSScreenSaver(){// window=new QMainWindow();qDebug()<<"Inlize";QSettings *readini = new QSettings("/home/config.ini", QSettings::IniFormat, 0); //初始化读取当前背光值,并存储readini->beginGroup("backlight");dutycycle=readini->value("backlight_duty").toInt();qDebug("dutycycle=%d",dutycycle);readini->endGroup();delete readini;freq= 6500;}void ScreenSaver::restore(){qDebug("enter screen restore");//open pwmif((fd=open("/dev/pwm9",O_RDWR)) < 0){printf("open device gptimer8 error\n");exit(1);// close();}printf("The frequecy is %d Hz\n",freq);printf("The duty cycle is %d percent\n",dutycycle);ioctl(fd,IOCTL_FREQUENCY,freq);ioctl(fd,IOCTL_DUTYCYCLE,dutycycle);::close(fd);}bool ScreenSaver::save(int level){//close pwm 反逻辑if((fd=open("/dev/pwm9",O_RDWR)) < 0){printf("open device gptimer8 error\n");exit(1);// close();}printf("The frequecy is %d Hz\n",freq);printf("The duty cycle is 90\n");ioctl(fd,IOCTL_FREQUENCY,freq);ioctl(fd,IOCTL_DUTYCYCLE,100);::close(fd);qDebug()<<"window show";return true;}void ScreenSaver::ScreenSaver_parameter_changed(int interval){QWSServer::setScreenSaverInterval(interval*1000);// ignore the key/mouse event that turns on the screen}屏保设置还需要做一些其他的设置。
QT 屏保设置

简单总结下在嵌入式arm板中设置屏保的方法:在Qt中有二个QWSScreenSaver类这个类的定义如下定义路径qwindowsystem_qws.hclass Q_GUI_EXPORT QWSScreenSaver086 {087 public:088 virtual ~QWSScreenSaver();089 virtual void restore()=0;090 virtual bool save(int level)=0;091 };是类class QWSServerPrivate 的成员,在成类中与屏保设置相关的类成员还有QTime screensavertime;097 QTimer* screensavertimer;098 int* screensaverintervals;099 int screensavereventblocklevel;100 bool screensaverblockevents;101 bool screensaverblockevent( int index, int *screensaverinterval, bool isDown );102 QWSScreenSaver* saver;void screenSave(int level);在设置屏保的时候,Qt程序要作为服务端来运行,QWSScreenSaver中的虚函数virtual void restore()和virtual bool save(int level)都是用来重载,设置在屏保状态的处理在后面的函数中重载,设置恢复屏保的处理在前面的虚函数中执行,为了节省功耗,我在屏保状态下关掉屏幕的背光,在恢复状态下开启背光。
我用这个方法做个简单的测试,能实现屏保时间设置的动态更。
说下我这个测试的调试过程定义了个SCreenSaver类,继承自QWSScreenSaver类的定义和实现代码如下#ifndef SCREENSAVER_H#define SCREENSAVER_H#include <QWidget>#include <QWSServer>class ScreenSaver : public QWSScreenSaver{public:ScreenSaver();virtual void restore();virtual bool save(int level);private:int freq;int dutycycle;public slots:void ScreenSaver_parameter_changed(int);};#endif // SCREENSAVER_H实现文件如下#include "screensaver.h"#include <QDebug>#include <QtCore>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/stat.h>#include <fcntl.h>#define IOCTL_FREQUENCY 0#define IOCTL_DUTYCYCLE 1static int fd;ScreenSaver::ScreenSaver():QWSScreenSaver(){// window=new QMainWindow();qDebug()<<"Inlize";QSettings *readini = new QSettings("/home/config.ini", QSettings::IniFormat, 0); //初始化读取当前背光值,并存储readini->beginGroup("backlight");dutycycle=readini->value("backlight_duty").toInt();qDebug("dutycycle=%d",dutycycle);readini->endGroup();delete readini;freq= 6500;}void ScreenSaver::restore(){qDebug("enter screen restore");//open pwmif((fd=open("/dev/pwm9",O_RDWR)) < 0){printf("open device gptimer8 error\n");exit(1);// close();}printf("The frequecy is %d Hz\n",freq);printf("The duty cycle is %d percent\n",dutycycle);ioctl(fd,IOCTL_FREQUENCY,freq);ioctl(fd,IOCTL_DUTYCYCLE,dutycycle);::close(fd);}bool ScreenSaver::save(int level){//close pwm 反逻辑if((fd=open("/dev/pwm9",O_RDWR)) < 0){printf("open device gptimer8 error\n");exit(1);// close();}printf("The frequecy is %d Hz\n",freq);printf("The duty cycle is 90\n");ioctl(fd,IOCTL_FREQUENCY,freq);ioctl(fd,IOCTL_DUTYCYCLE,100);::close(fd);qDebug()<<"window show";return true;}void ScreenSaver::ScreenSaver_parameter_changed(int interval){QWSServer::setScreenSaverInterval(interval*1000);// ignore the key/mouse event that turns on the screen}屏保设置还需要做一些其他的设置。
Qt中窗体和按钮添加背景图片的方法

Qt中添加背景图片的方法(转)工作似乎走上正轨了,上周五的工作是做一个界面,用到QFrame和QPushButton,QFrame 做主面板,QPushButton为其子控件,需要在主面板上贴背景图片,还需要在QPushButton 上贴上相应的图标,弄了一天,再加上今天一小会,终于有一点点结果了。
通过从Google上搜索各种方法(现在才知道Google比Baidu强大很多啊),最后都试了一些,主要有下面几种方法:1. QPalette的方法#include <QApplication>#include <QtGui>int main(int argc, char *argv[]){QApplication app(argc,argv);QFrame *frame = new QFrame;frame->resize(400,700);QPixmap pixmap("images/frame.png");QPalette palette;palette.setBrush(frame->backgroundRole(),QBrush(pixmap));frame->setPalette(palette);frame->setMask(pixmap.mask()); //可以将图片中透明部分显示为透明的frame->setAutoFillBackground(true);frame->show();return app.exec();}注意图片路径怎么表示,我的图片放在该工程下的images文件夹中。
存在问题:图片可以显示出来,但是图片大小不能和frame大小一致,显示效果不好,具体怎样调整大小,以后再补充,效果如下(设置了透明的,好像很漂亮~透明部分将我的桌面显示出来了~_~):2.setStyleSheet方法(非常好用的方法) #include <QApplication>#include <QtGui>int main(int argc, char *argv[]){QApplication app(argc,argv); QFrame *frame = new QFrame;frame->setObjectName("myframe");frame->resize(400,700);frame->setStyleSheet("QFrame#myframe{border-image:url(images/frame.png)}" ); frame->show();return app.exec();}效果如下:注意:很漂亮的效果吧~~注意代码中红线的部分噢,设置ObjectName后,才能保证setStyleSheet只作用在我们的frame上,不影响其子控件的背景设置。
设置widget背景颜色

Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())收藏在Qt中设置widget背景颜色或者图片方法很多种:重写paintEvent() , 调色板QPalette , 样式表setStyleSheet等等。
但是各种方法都有其注意事项,如果不注意则很容易陷入麻烦中。
1:setStyleSheet()这个函数我一直很喜欢使用,因为只要写一句就可以实现效果,比其他方法都简单,但是其却有一个很值得注意的地方,也就是这个地方让我大吃苦头。
亦即:①:该函数只能用于设置有父窗口的子窗口的背景!如果一个窗口没有子窗口,则无法使用该函数来设置背景颜色或图片!!②:同时:对于一个父窗口而言:如果我们用setStyleShette设置了其样式,而对于其子窗口:如果没有用同样的函数来设置的话,则其子窗口的样式和其父窗口完全一致,亦即:其集成了自己父窗口的样式!③:延伸:对顶层窗口(没有父窗口),其有若干个子窗口,则当我们用setStyleShette来设置这个顶层窗口的样式后,依据①可知:该父窗口本身没有任何变化,亦即设置没有生效;而其子窗口:只要子窗口本身没有用setStyleShette来设置自己的样式表,则其就是用的自己父窗口的样式表!!例如:主窗口(没有父类)为MainWinMainWin::MainWin(){this->setStyleSheet("background-image:url(:/bmp/IMG_0345.JPG)");iButton = new QPushButton(this);iLabel = new QLabel(iButton);}运行一下,效果如下:亦即:虽然我们设置的是顶层的父窗口,但是该样式却是在其子窗口中生效,而顶层父窗口没有任何变化!这验证了①。
修改一下上例代码:MainWin::MainWin(){this->setStyleSheet("background-image:url(:/bmp/IMG_0345.JPG)");iButton = new QPushButton(this);iLabel = new QLabel(iButton);iLabel->setStyleSheet("background-image:url(:/bmp/1257253475842.jpg)" );}则运行效果如下:可见:子窗口只有调用setStyleSheet()设置了自己的样式后才可以隔断父窗口的样式,否则其将是用父窗口的样式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
QT中如何设置窗体的背景图片2013-08-24 09:27:38
分类:嵌入式
一、设置方法有两种,如下:
1、利用style sheet给窗体设置背景
使用stylesheet设置背景图片还是有一些要注意的,如果是在mainwindow和dialog 中,直接右键change style sheet在add resource中选择background-image或者
border-image,选择资源文件中的图片就行了(前者是按像素显示图片,后者可根据窗体大小来自动缩放图片,通常使用后者,前者如果界面与图片大小不一样,则背景的显示可能就不是整张图片了),如下图:
注意:
a、但在widget中就不行,你会发现,用同样的方法,背景并没有发生改变,而仅仅是它的子窗体背景图片发生了改变。
那么在widget中要如何做呢,我们在widget中放置一个frame,然后对frame通过stylesheet设置背景,后面窗体里所有的部件都放在这个frame里。
b、我们知道,子窗体会继承父窗体的属性,也就是说,父窗体的背景,在子窗体中也会有,那如何让子窗体不继承父窗体的背景呢,同样的,还是在Edit Style Sheet里,需要输入如下代码:(这样就可以解决窗体中的按键、QLable等控件与主窗体的一样。
)
#desktop {
border-image: url(:/images/desktop.jpg);
}
#desktop * {
border-image:url();
}
desktop是你的窗体名。
2、不过也可以通过如下代码来实现:
QWidget *widget = new QWidget();
widget->setAutoFillBackground(true);
QPalette palette;
QPixmap pixmap(":/Resources/Penguins.jpg");
palette.setBrush(QPalette::Window, QBrush(pixmap));
widget->setPalette(palette);
widget->show();
一般我喜欢使用前面去设计,在ui中进行,方便简单。