qt中关于设置颜色(QPalette和QPixmap)

本文介绍如何使用Qt进行界面美化,包括设置背景颜色、前景颜色、使用样式表、设置圆角控件和窗口、调整透明度等多种技巧。

http://blog.sina.com.cn/s/blog_9d16de810100zs6r.html

(1).设置背景颜色

QPixmap是一个绘图设备

pix=new QPixmap(this->size());//size(0当前客户区的大小(例子见DrawWidgets:)

pix->fill(Qt::white);

 利用QPixmap还可以设置QToolButton颜色:

colorBtn=newQToolButton;

   QPixmap pixmap(20,20);
   pixmap.fill(Qt::black);
   colorBtn->setIcon(QIcon(pixmap));

 

(2)

 
//   QWidget *widget = new QWidget();
//    widget->setAutoFillBackground(true);
//    QPalette palette;
//    QPixmap pixmap(":/image.png");
//    palette.setBrush(QPalette::Window, QBrush(pixmap));
//    widget->setPalette(palette);
//    widget->show();
 
(3) QWidget *widget = new QWidget();
    QPalette bgpal;
    bgpal.setColor (QPalette::Background, QColor (255, 0 , 0, 255));
    //bgpal.setColor (QPalette::Background, Qt::transparent);
    bgpal.setColor (QPalette::Foreground, QColor(255,255,255,255));
    widget->setPalette(bgpal);
    widget->show();

 


一般的属于QWidget子类的一些控件,可以直接使用样式表,例如
label->setStyleSheet("color:white");


Qpalette类相当于对话框或是控件的调色板,它管理着控件或窗体的所有颜色信息,每个窗体或控件都包含一个QPalette对象,在显示时按照它的QPalette对象中对各部分各状态下的颜色的描述来进行绘制。就像油漆匠的油漆计划,当要刷墙时,到计划中去查一下墙需要刷成什么颜色。采用这种方式可以很方便地对窗体的各种颜色信息进行管理。
QPalette类有两个基本的概念,一个是ColorGroup,另一个是ColorRole。
ColorGroup指的是3中不同的状态,包括一下几种。QPalette::Active:获得焦点的状态。QPalette::Inactive:未获得焦点的状态。QPalette::Disable:不可用状态。通常情况下,Active状态与Inactive状态下颜色显示是一致的,当然也可根据需要设置成不一样的颜色
ColorRole指的是颜色主题,即对窗体中不同部位颜色的分类,如QPalette::Window是指背景色,QPalette::WindowText指的是前景色等。
QPalette::setColor()函数对某个主题的颜色及状态进行设置。
QPalette::setBrush()函数对显示进行更改,这样就有可能使用图片而不仅仅是单一的颜色来对主题进行填充了。
QPalette::setColor(ColorRole r,const Qcolor &c);对某个主题颜色进行设置,并不区分状态
QPalette::setColor(ColorGroup gr,ColorRole r,const QColor &c);对主题颜色进行设置的同时还区分了状态。
xxx->setAutoFillBackground(true);
Qpalette p=xxx->palette();
p.setColor(QPalette::Window,color);//p.setBrush(QPalette::Window,brush);
xxx->setPalette(p);
Qt之前版本中有关背景色设置的函数如setBackgroundColor()或是前景色设置的函数如setForegroundcolor()在Qt4中都被废止,统一由QPalette类进行管理。
注意要先调用setAutoFillBackground(true)设置窗体自动填充背景。如:
ui->label->setAutoFillBackground(true);    ui->label->setPalette(QColor(list.at(1).toInt(),list.at(2).toInt(),list.at(3).toInt(),list.at(4).toInt()));
ui->label->setPalette(Qt::blue);
QPalete::Window,通常指窗口部件的背景色;

  QPalette:WindowText,通常指窗口不见的前景色;

  QPalette::Base,指文本输入窗口部件(比如QtextEdit,QLinedit等)保利地产的背景色.//应该用这个的

  QPalette::Text,与QPalette::Base一块使用,指文本输入窗口部件的盗梦空间前景色;

  QPalette::Button,指按钮窗口部件的背景色;

  QPalette::ButtonText,指按钮窗口部件的前景色
 

一. 背景刷成黑色,前景色设为白色。 方法一、paltette方式,经测试,该方法不会影响到其他控件,推荐使用
QPalette bgpal = palette();
bgpal.setColor (QPalette::Background, QColor (0, 0 , 0, 255));
//bgpal.setColor (QPalette::Background, Qt::transparent);
bgpal.setColor (QPalette::Foreground, QColor
(255,255,255,255)); setPalette (bgpal);
方法二、stylesheet方式 影响子控件的方法是:
setStyleSheet ("background-color: #000000;color: #ffffff;");
不影响子控件的方法是:
setStyleSheet ("venus--TitleBar {background-color:
#000000;color: #ffffff;}");
二. 圆角控件 用stylesheet方式
setStyleSheet ("border:2px groove
gray;border-radius:10px;padding:2px 4px;");
三. 圆角窗口 RoundRectWin::RoundRectWin() { QPalette p = palette();
QPixmap img("roundrect.png");
QBitmap mask("roundrect_mask.png");
p.setBrush(QPalette::Window, QBrush(img));
setPalette(p);
setMask(mask);
resize(img.size());
//setWindowFlags(Qt::FramelessWindowHint);//这句会去掉标题栏 }
注意:mask的图多余部分设为白色
四. 半透明窗口
1.窗口整体透明,但是窗体上的控件不透明。 通过设置窗体的背景色来实现,将背景色设置为全透。 QPalette pal =
palette();
pal.setColor(QPalette::Background,
QColor(0x00,0xff,0x00,0x00)); setPalette(pal); 试验效果:
窗体标题栏不透明;
窗体客户区上的控件不透明,QLabel控件只是字显示,控件背景色透明; 窗体客户区完全透明。
另外从网上看到的方法: setAttribute(Qt::WA_TranslucentBackground, true);
试验的结果是类似于上面的方法,但有时候窗体会被一些杂色斑点填充,未找到原因。
2.窗口及其上面的控件都半透明:
setWindowOpacity(0.7)
试验效果:窗口及控件都半透明。注意不能够setWindowFlags(Qt::FramelessWindowHint);要不就不起作用
3.窗口整体不透明,局部透明:
在Paint事件中使用Clear模式绘图。
void TestWindow::paintEvent( QPaintEvent* )
{ QPainter p(this);
 p.setCompositionMode(
QPainter::CompositionMode_Clear ); p.fillRect( 10, 10, 300,
300, Qt::SolidPattern ); }
试验效果:绘制区域全透明。如果绘制区域有控件不会影响控件。
以上实验均是基于Directfb的Qte测试。在Linux下及Windows下效果会略有不同。
比如在Windows下第3个实验,绘制区域就是一个黑窟窿,如果Window本身半透,则是Window下面的内容加上半透效果,不是全透明效果。
五. 控制QPixmap的alpha
QPixmap temp(pixmapTop.size()); temp.fill(Qt::transparent);
QPainter p(&temp);
p.setCompositionMode(QPainter::CompositionMode_Source);
p.drawPixmap(0, 0, pixmapTop);

p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
p.fillRect(temp.rect(), QColor(0, 0, 0, alpha));
//--lable显示前景图片 ui->label->setScaledContents(true);
ui->label->setPixmap(temp);
六. layout 的边界 layout->setMargin (0);

<think>好的,我现在需要帮助用户在QT中自定义鼠标光标的样式颜色。首先,我得回顾一下用户提供的引用内容,看看有没有相关的信息。根据引用[1],用户可以通过QCursor类使用自定义的位图掩码来创建光标。具体步骤包括准备透明的PNG图片掩码图片,然后设置热点位置。例如,使用QBitmap加载图片,再传给QCursor构造函数,最后用setCursor应用样式。 接下来,引用[2][3]提到可以为特定部件设置光标样式,比如使用setCursor方法并传入Qt内置的光标类型,比如Qt::PointingHandCursor。但用户想要的是自定义样式颜色,这可能需要更深入的方法。 引用[4]讨论了全局光标的设置还原,提到使用setOverrideCursorrestoreOverrideCursor来管理全局光标状态,避免影响其他部件。这点需要注意,尤其是在设置全局样式时,需要及时还原,防止冲突。 引用[5]展示了如何为特定组件设置内置光标样式,比如QTextEdit的视口设置为箭头光标。但同样,这属于使用预设样式,而非自定义。 用户的问题涉及颜色,但标准的QCursor使用位图,而位图是黑白两色的。要改变颜色,可能需要使用掩码或者生成带有反色效果的图片。比如引用[1]提到可以生成与背景反差的效果,可能通过掩码来实现不同区域的颜色显示。或者,可能需要使用彩色图片,但需要确认QT是否支持。但根据常规知识,QCursor通常使用单色位图,因此可能需要通过掩码组合来创建视觉上的颜色变化。或者,可能需要使用更高版本的QT特性,比如QPixmap代替QBitmap,但需要查阅文档确认。 可能的步骤是:准备两张图片,一张是前景(bitmap),另一张是掩码(mask),其中掩码决定哪些区域显示系统颜色。例如,bitmap中的白色部分显示前景色,mask中的黑色部分显示背景色。但颜色可能受系统主题影响,因此可能需要测试不同的组合。 另外,用户提到颜色,可能需要动态生成带有颜色的光标。例如,使用QPainter在运行时绘制带有颜色的图像,然后转换为位图掩码。或者,使用QPixmap的彩色图像,但QCursor是否支持?需要检查QT文档,发现QCursor构造函数接受QPixmap作为参数,可能支持彩色光标,但可能受平台限制。 综上,解决方案可能包括:使用彩色QPixmap创建光标,但需要确保平台支持,或者通过位图掩码的组合模拟颜色。例如,在引用[1]的例子中使用的是QBitmap,但可能可以尝试使用QPixmap代替,并设置热点。或者,使用掩码来反转颜色,达到高亮效果。 因此,步骤可能为:1. 创建彩色图像(如PNG带透明通道);2. 转换为QPixmap;3. 创建QCursor对象;4. 应用光标。但需要验证这种方法是否可行。或者,可能需要使用QBitmap的黑白图像,然后结合系统颜色来显示不同部分。 另外,关于颜色,可能需要使用QCursor的setPos或结合QPalette,但不确定。需要进一步查阅QT文档。例如,QCursor的构造函数有接受QPixmap热点的版本,可能允许彩色光标。例如,在QT5中,QCursor可以接受QPixmap,这样彩色光标可能可行,但某些平台可能只支持黑白。 因此,用户可能的实现方式是使用QPixmap加载彩色图像,然后创建QCursor对象,并应用。例如: QPixmap pixmap("color_cursor.png"); QCursor cursor(pixmap, hotX, hotY); widget->setCursor(cursor); 但需要确保图像格式正确,且平台支持。如果不行,可能需要使用位图掩码的组合,通过设计图像的黑白部分来利用系统颜色设置,比如前景色背景色。 总结:用户需要自定义样式颜色,可能的解决方案是使用彩色QPixmap创建光标,如果平台支持,或者使用位图掩码结合系统颜色来模拟颜色效果。同时,注意全局光标的设置还原,避免影响其他部件。</think>### 在QT设置自定义鼠标光标样式颜色的分步说明 #### 一、自定义光标样式 通过位图(QBitmap)掩码(Mask)实现自定义光标样式,步骤如下: 1. **准备透明背景的PNG图片** 需两张图片:`bitmap.png`(光标形状)`mask.png`(掩码,控制显示区域)。例如: - `bitmap.png`:白色区域表示光标可见部分 - `mask.png`:黑色区域表示实际生效区域[^1] 2. **加载图片并创建QCursor对象** ```cpp QBitmap bitmap("bitmap.png"); QBitmap mask("mask.png"); QCursor cursor(bitmap, mask, hotX, hotX); // hotX/hotY为热点坐标 ``` 3. **应用自定义光标** - **局部应用**:为特定控件设置样式 ```cpp QPushButton *button = new QPushButton; button->setCursor(cursor); ``` - **全局应用**:影响整个应用程序 ```cpp qApp->setOverrideCursor(cursor); // 设置全局光标 // 恢复默认光标时调用 qApp->restoreOverrideCursor(); ``` #### 二、实现光标颜色效果 由于QCursor默认使用黑白位图,需通过以下方法模拟颜色: 1. **利用系统颜色反色** 掩码的黑色区域会显示为系统前景色,白色区域显示为背景色。例如: ```cpp QBitmap bitmap("shape.png"); // 白色为光标形状 QBitmap mask("mask.png"); // 黑色区域覆盖光标 QCursor cursor(bitmap, mask); // 黑色区域显示为当前主题色 ``` 2. **使用彩色QPixmap(需平台支持)** 部分平台支持彩色光标,可直接加载彩色图像: ```cpp QPixmap pixmap("color_cursor.png"); QCursor cursor(pixmap, hotX, hotY); ui->label->setCursor(cursor); ``` #### 三、注意事项 1. **热点位置校准** 设置热点(hotX, hotY)确保光标操作精准,例如箭头尖端或十字中心。 2. **全局光标还原** 使用全局样式后需及时恢复,避免影响其他控件: ```cpp qApp->setOverrideCursor(Qt::WaitCursor); // 临时设置为等待光标 // 耗时操作... qApp->restoreOverrideCursor(); // 恢复原样式[^4] ``` 3. **跨平台兼容性** 彩色光标可能在某些系统不生效,建议同时提供黑白版本备用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值