Qt qlabel怎样实现透明

Qt qlabel怎样实现透明,第1张

QLabel可以利用“qss”实现透明显示,代码如下:

“QLabel{  background-color: rgba(255, 255, 224, 0%);   border: 2px solid black;}12345”。

Qt 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。

2008年,Qt Company科技被诺基亚公司收购,Qt也因此成为诺基亚旗下的编程语言工具。2012年,Qt被Digia收购。

2014年4月,跨平台集成开发环境Qt Creator 310正式发布,实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整,至此实现了全面支持iOS、Android、WP,它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。

qtcreator如何在stylesheet中设置

项目建立完成后:

右键点你的项目 “Add New”->"QT Resource file" 生成一个qrc文件

然后双击它 点add 然后Add Prefix 再Add file 完事之后build一下

在你的ui上点右键 ->Change StyleSheet ->add Resource ->backgroud-image 顺着往下点就能看见你在qrc里添加的那张了

摘要:

QT Create中,对button或者window等部件设置背景、颜色、透明等样式时,需要用到style sheet,可以直接在代码里写,也可以在ui设计师里通过右键change style sheet的方法来设置,本人是使用的后面的方式,下面介绍几种常见的用法。

介绍:

作者使用的开发环境为:qt creator 201005, qt47。

1、利用style sheet给窗体设置背景

使用stylesheet设置背景还是有一些要注意的,如果是在mainwindow和dialog中,直接右键change style sheet在add resource中选择background-image或者border-image,选择资源文件中的就行了(前者是按像素显示,后者可根据窗体大小来自动缩放),如下图:

但在widget中就不行,你会发现,用同样的方法,背景并没有发生改变,而仅仅是它的子窗体背景发生了改变。

那么在widget中要如何做呢,我们在widget中放置一个frame,然后对frame通过stylesheet设置背景,后面窗体里所有的部件都放在这个frame里。

我们知道,子窗体会继承父窗体的属性,也就是说,父窗体的背景,在子窗体中也会有,那如何让子窗体不继承父窗体的背景呢,同样的,还是在Edit Style Sheet里,需下输入如下代码:

#desktop {

border-image: url(:/images/desktopjpg);

}

#desktop {

border-image:url();

}

desktop是你的窗体名。

2、menubar设置透明

我想做一个菜单按钮,像ubuntu的应用程序菜单一样,能在点击时d出一个下拉框,我选择了用mainwindow来实现,但我如现menuba显示在顶层很难看,如何才能不让它显示呢。

设置menuba的stylesheet,

background-color:transparent

将背景设置为透明。

3、tool button不显示边框

当我们设置button的icon时,发现icon的形状并不与button完全一致,如下图:

设置stylesheet

border-style: flat;

效果如下:

注意,一定要选择tool button,而不要选择push button,因为push button活动的时候会有一个虚线框。

要达到上图的效果,除了设置border-style:flat,可不可以将style设置为transparent呢?设置成transparent后,显示上看,效果是和上图的一样,但当按下时,button没有被覆盖的地方就会显示被按下时的颜色。

4、在父窗体的stylesheet中设置子部件的属性

假设有多个button,且它们的样式是一样的,那是不是需要一个个设置呢?不需要的,我们可以在父窗体中进行设置,那么子部件都会继承它的属性。

如果某个button的样式特殊,再单独修改就行了,下面举个实例,在父窗体的stylesheet中设置如下

QDialog{background:rgb(229, 255, 239)}

QMenuBar{background:url(:/image/headerbmp)}

QStatusBar{background:url(:/image/headerbmp)}

QPushButton{background:url(:/image/headerbmp)}

QLCDNumber{background:url(:/image/lcdbmp)}

QLabel{color: rgb(0, 0, 255)}

QDial{background-color: rgb(67, 67, 67)}

QGroupBox {

border-width:2px;

border-style:solid;

border-color:#FFFFFF;

}

QGroupBox{color: rgb(255,255, 255)}

QToolButton{border-style: flat;}

做Qt开发的会知道QLineEdit,QLabel是默认没有clicked事件的,但是Qt有很好的一套信号/槽机制,而且Qt是基于C++面向对象的思想来设计的,那么我们就很容易通过自己定义一些类,重写QLineEdit或者QLabel的一些方法去实现没有的方法,比如clicked事件本人就以QLineEdit QLabel添加clicked事件来说明

Qt里面有个关键字emit,这个关键字意思就是触发一个信号,具体emit更详细的使用方法,可以百度,本文不做具体详解,只需知道emit是触发一个信号的方法即可

下面我们就开始讲如何给QLineEdit添加clicked()事件首先我们需要一个类,继承QLineEdit,我们定义为:mylineedit那么分析下clicked()事件,这个事件是因为我们鼠标单击点击了下lineedit,然后触发的,那么正好,我们想到了在Qt有个mousePressEvent事件,于是我们可以重写mousePressEvent事件,然后触发自定义一个clicked()的信号,这样就可以实现点击lineedit就会发送一个clicked()的信号,代码如下:

mylineedith

123456789101112131415161718192021222324#ifndef MYLINEEDIT_H#define MYLINEEDIT_H #include <QLineEdit>#include <QMouseEvent> class mylineedit : public QLineEdit{    Q_OBJECTpublic:    explicit mylineedit(QWidget parent = 0);protected:    //重写mousePressEvent事件    virtual void mousePressEvent(QMouseEvent event); signals:    //自定义clicked()信号,在mousePressEvent事件发生时触发    void clicked(); public slots: }; #endif // MYLINEEDIT_H

mylineeditcpp

1234567891011121314151617#include "mylineedith" mylineedit::mylineedit(QWidget parent) :    QLineEdit(parent){} //重写mousePressEvent事件,检测事件类型是不是点击了鼠标左键void mylineedit::mousePressEvent(QMouseEvent event) {    //如果单击了就触发clicked信号    if (event->button() == Qt::LeftButton) {        //触发clicked信号        emit clicked();    }    //将该事件传给父类处理    QLineEdit::mousePressEvent(event);}

通过以上代码,我们的lineedit已经具有了发出clicked信号的能力,那么我们就可以把他做为一个组件放到QWidget或者其他容器里面,在QWidget类里面我们提供一个处理lineedit clicked信号的槽函数,然后在QWidget构造函数里面绑定lineedit clicked信号跟对应的处理函数,这样就可以达到我们想要的效果

widgeth

123456789101112131415161718192021222324252627#ifndef WIDGET_H#define WIDGET_H #include <QWidget> namespace Ui {    class Widget;} class Widget : public QWidget{    Q_OBJECT public:    explicit Widget(QWidget parent = 0);    ~Widget(); private:    Ui::Widget ui; private slots:    //定义槽函数处理lineedit clicked    void handlelineeditclicked();    void handlelabelclicked();}; #endif // WIDGET_H

widgetcpp

1234567891011121314151617181920212223242526#include "widgeth"#include "ui_widgeth" Widget::Widget(QWidget parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    //在widget的构造函数绑定lineedit的clicked信号    connect(ui->lineEdit, SIGNAL(clicked()), this, SLOT(handlelineeditclicked()));    connect(ui->label, SIGNAL(clicked()), this, SLOT(handlelabelclicked()));} Widget::~Widget(){    delete ui;} void Widget::handlelineeditclicked() {    //在处理lineedit clicked函数里我们将lineedit背景色变为红色    ui->lineEdit->setStyleSheet("background-color:red");} void Widget::handlelabelclicked() {    ui->label->setStyleSheet("background-color:green");}

这样,我们的lineedit便具有了clicked的功能了

maincpp

1234567891011#include <QtGui/QApplication>#include "widgeth" int main(int argc, char argv[]){    QApplication a(argc, argv);    Widget w;    wshow();     return aexec();}

运行之后的效果就是点击lineedit,然后lineedit背景变为红色同理,QLabel增加clicked功能也可以实现了效果如下:

可以使用信号SIGNAL和槽SLOT的机制来做:

做一个计时器QTimer定时更新温度值,没更新一次把更新结果显示到QLineEdit中。

另一种方法,你做的那个温度控件,send一个信号,触发槽,将当前温度值显示到QLineEdit中。

修改QlineEdit的值都用  setText(“当前温度值”) 。

例如第一种方法:

  QTimer updateTimer = new QTimer(this);

  connect(updateTimer,SIGNAL(timeout()),this,SLOT(updateTemp()));

  updateTimer->start(1000);  //以1000ms周期刷新实时温度值

updateTemp()

{  lineEdit->setText(nowTemp);}

  3 另外去掉白色底这个,用函数setStyleSheet(const QString &styleSheet)来实现。具体语法参看帮助文件中的:The Style Sheet Syntax

例如修改:lineEdit->setStyleSheet("background:green;color:red");  //背景色green,前景色red

1 MLCNWidget w=new MLCNWidget;

w->setAutoFillBackground(true);

QPalette palette;

palettesetBrush(w->backgroundRole(), QBrush(QPixmap("/pic/new_images/bgjpg")));

w->setPalette(palette);

w->showFullScreen();

2 使用QSS

控件->setStyleSheet("background-image:url(/pic/new_images/start_jiankongpng)");

这样做的一个缺点是一旦在一个控件中使用StyleSheet了,其中的子控件就全部会继承,也就是在上面显示主控件的背景了。在网上看到可以通过{}的方式防止继承,但我试了下,没成功,不知道到底行不行。

3 关于label上加的

估计除了widget,加的最多的就是QButton和QLabel了,QLabel里面看QT文档可以发现有个槽,setPixmap,用了下,特别好用。

uilabel_5->setPixmap(QPixmap("/pic/new_images/start_jiankongpng"));

qt背景改不掉原因如下:

1、路径问题:请确保您设置的路径是正确的,建议使用绝对路径来指定位置,以避免路径错误。

2、覆盖问题:如果在程序中同时设置了多个不同控件的背景,可能会出现后设置的被前面的覆盖的情况。此时需要注意设置控件背景的顺序。

3、控件属性问题:一些控件可能不支持使用背景,或者对于某些控件,需要更改其他属性才能正确显示背景。比如设置QLabel的背景色为透明色才能正确显示背景。

以上就是关于Qt qlabel怎样实现透明全部的内容,包括:Qt qlabel怎样实现透明、qtcreator如何在stylesheet中设置图片、python 的qlabel的mousepressevent怎么用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9539513.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存