如何实现QT窗口背景图片随窗口大小而变化

时间一粒 2011-10-12 06:55:44
最近在学习QT。。。
给窗口添加背景图片后,但是把窗口最大化后,因为图片小,重复出现了,如何实现背景图片随窗口大小而变化呢?

求高手解答!
...全文
4881 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingshaohumooner 2012-02-28
  • 打赏
  • 举报
回复
1.
如果只能用setStyleSheet样式表来设置背景图片的话,该图片是无法缩放的,如果其大小与widget窗口大小不相符,则我们无法用程序来实现图片的缩放,除非我们直接处理图片使其大小与widget窗口相符;
2.
而如果不局限于用setStyleSheet样式表来设置的话,我们可以选择用QPalette调色版,其内部setBrush()之前,我们完全可以先对图片进行scale缩放再刷到窗口上,这样就避免直接去处理图片,灵活性强一点!
3.
还可以使用重载paintEvent方法:
void MyFrame::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawPixmap(0,0,400,700,QPixmap("images/frame.png"));
}
q280159235 2011-12-04
  • 打赏
  • 举报
回复
使用paintEvent时,
void clock1::paintEvent(QPaintEvent *)
{
QPainter paint(this);
paint.drawPixmap(0,0,this->width(),this->height(),QPixmap(":/1.png"));
怎么没有背景啊 我也是刚学,费解
就这样好了 2011-10-14
  • 打赏
  • 举报
回复
我知道的有两种方法
1.用setStyleSheet .这里要注意使用border-image而不是image和background
2.用scaled方法,传递一个QSize参数,这个参数就是你窗口的size
念茜 2011-10-13
  • 打赏
  • 举报
回复 6
方案一:使用paintEvent

void Widget::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
painter.drawPixmap(0,0,this->width(),this->height(),QPixmap(":/xxx.png"));
}


方案二:使用setStyleSheet

widget->setStyleSheet("border-image: url(:/xxx.png)");
时间一粒 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yiyaaixuexi 的回复:]

用setStylesheet加载 图片方式
background-image 和 border-image 测试下哪个效果正确
[/Quote]
能个具体的例子吗?QT还是刚学...如果帮忙弄好的话,再加分
yzhj2005 2011-10-13
  • 打赏
  • 举报
回复
setStyleSheet("border-image: url(:/xxx.png)");
念茜 2011-10-12
  • 打赏
  • 举报
回复
用setStylesheet加载 图片方式
background-image 和 border-image 测试下哪个效果正确
linshuqiang 2011-10-12
  • 打赏
  • 举报
回复
围观围观~~
时间一粒 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dbzhang800 的回复:]

不妨先介绍你如何做的。是否使用 stylesheet 等
[/Quote]
当窗口最大化后,背景图片就会重复出现了..我是想让背景图片适应窗口的大小,不会重复
时间一粒 2011-10-12
  • 打赏
  • 举报
回复
main函数的一些主要语句

HttpClient *httpclient = new HttpClient();
QPixmap pixmap(":bg.PNG");
QPalette pal;
pal.setBrush(httpclient->backgroundRole(),QBrush(pixmap));
httpclient->setPalette(pal);
httpclient->setAutoFillBackground(true);

httpclient->setWindowFlags(Qt::WindowMinMaxButtonsHint);//窗口的最大小化
httpclient->show();

return a.exec();
dbzhang800 2011-10-12
  • 打赏
  • 举报
回复
不妨先介绍你如何做的。是否使用 stylesheet 等
8-1 用QPainter绘图(Painting with QPainter) 2011-10-26 19:56:04| 分类: 默认分类 | 标签: |字号大中小 订阅 8-1 用QPainter绘图(Painting with QPainter) 分类: C++ GUI Programming with Qt 4 2007-05-29 21:52 8228人阅读 评论(3) 收藏 举报 要在绘图设备(paint device,一般是一个控件)上开始绘制,我们只要创建一个QPainter,把绘图设备指针传给QPainter对象。例如: oid MyWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); ... } 使用QPainter的draw…()函数我们可以绘制各种图形。图8.1给出了主要的一些。绘制的方式由QPainter的设置决定。设置的一部分是从绘图设备得到的,其他是初始化时的默认值。三个主要的设置为:画笔,刷子和字体。 画笔用来绘制直线和图形的边框。包含颜色,宽度,线型,角设置和连接设置。 刷子是填充几何图形的方式。包含颜色,方式设置,也可以是一个位图或者渐变色。 字体用来绘制文本。字体的属性很多,如字体名,字号等。 这些设置随时可以改变,可用QPen,QBrush,QFont对象调用setPen(),setBrush(),setFont()修改。 Figure 8.1. QPainter's most frequently used draw...() functions Figure 8.2. Cap and join styles < XMLNAMESPACE PREFIX ="O" /> < XMLNAMESPACE PREFIX ="V" /> Figure 8.3. Pen styles Figure 8.4. Predefined brush styles 现在来看看具体的例子。下面的代码是绘制图8.5(a)中椭圆的代码: QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap)); painter.setBrush(QBrush(Qt::green, Qt::SolidPattern)); painter.drawEllipse(80, 80, 400, 240); 调用函数setRenderHint(QPainter::Antialiasing,true),使绘制时边缘平滑,使用颜色浓度的变化,把图形的边缘转换为象素时引起的扭曲变形尽可能减少,在支持这一功能的平台或者绘图设备上得到一个平滑的边缘。 Figure 8.5. Geometric shape examples 下面的代码是图8.5(b)中绘制扇形的代码: QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(QPen(Qt::black, 15, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); painter.setBrush(QBrush(Qt::blue, Qt::DiagCrossPattern)); painter.drawPie(80, 80, 400, 240, 60 * 16, 270 * 16); 函数drawPie()的最后两个参数值的单位为一度的十六分之一。 下面的代码是图8.5(c)中绘制贝赛尔曲线的代码: QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); QPainterPath path; path.moveTo(80, 320); path.cubicTo(200, 80, 320, 80, 480, 320); painter.setPen(QPen(Qt::black, 8)); painter.drawPath(path); 通过连接基本图形元素,直线,椭圆,多段线,圆弧,二次和三次贝塞尔曲线等,QPainterPath类能确定任何矢量图形。因此,绘图路径(Painter paths)是最基本的绘制元素,任何图形和图形的组合都可以同路径(path)表示。 一个路径能够确定一个轮廓,由这个轮廓确定的区域可以由刷子来填充。在图8.5(c)中我们没有设置刷子,因此只绘制了轮廓。 以上的三个例子都是使用了默认的刷子(Qt::SolidePattern,Qt::DiagCrossPattern,Qt::NoBrush)。在现在的应用程序中,单色填充已经很少使用,渐变色填充开始收到欢迎。渐变是依靠颜色的变化实现两种或者多种颜色之间平滑的过渡。渐变通常用来处理3D效果,如使用Plastique渐变方式来表现QPushButtons。 Qt支持三种类型的渐变:线形渐变,圆锥渐变和圆形渐变(linear, conical, and radial)。下一节的OvenTimer例子就是在一个控件中使用了所有这三种渐变。 线形渐变由两个控制点和直线上的一系列颜色点组成。图8.6由下面的代码得到:在两个控制点之间,在三个不同的位置确定了三个不同的颜色值。位置有0到1的浮点数得到,0为第一个控制点,1为第二个控制点。不同位置点之间的颜色由差值计算得到。 LinearGradient gradient(50, 100, 300, 350); gradient.setColorAt(0.0, Qt::white); gradient.setColorAt(0.2, Qt::green); gradient.setColorAt(1.0, Qt::black); Figure 8.6. QPainter's gradient brushes 圆形渐变由颜色组,圆心(xc,yc),半径r和焦点(xf,yf)定义。圆心和半径定义一个圆,颜色从焦点开始扩散到周围,焦点可以是圆心也可以是圆内的任意一个点。 圆锥渐变由圆心(xc,yc)和一个角度a定义。颜色从圆心开始像表的秒针一样扩散。 我们已经提到了QPainter的画笔,刷子和字体设置。此外,QPainter还有其他一些设置影响图形和文字的绘制: 1. 背景刷子,当背景模式为Qt::OpaqueMode(缺省值为Qt::transparentMode)时,背景刷子用来填充几何图形,文字,和位图的背景(在绘图刷子的下面) 2. 刷子的起点:刷子的起始绘制点,通常为控件的左上角。 3. 剪辑区域,剪辑区域为绘图设备上可以绘制的区域,在剪辑区域意外进行的绘制是无效的。 4. 视口,窗口,世界坐标:这三个决定了QPainter的逻辑坐标映射到物理坐标的方式。通常,逻辑坐标和物理坐标是重合的。坐标系统在下一节介绍。 5. 组合方式:组合方式决定绘制设备上新绘制的象素和已经存在的象素的影响方式。缺省方式为覆盖式(source over),新象素画在已有元素的上面。只是有限一个绘图设备支持组合方式的设置,将在本章后面介绍 在任何时候,我们可以调用save()把QPainter当前的设置保存在一个内部栈里,然后调用restore()进行恢复。我们能够临时改变QPainter的一些设置,然后恢复先前的值 Qt的二位图形引擎是基于 QPainter 类的。它既可以绘制几何形状,也可以绘制像素映射、图像和文字。自定义窗口部件需要重新实现 QWidget::paintEvent() 。 void Widget:: paintEvent( QPaintEvent * /*paintEvent*/ ) { draw(); drawBezier(); } void Widget:: draw() { QPainter painter( this ); painter. setPen( QPen ( Qt :: black, 10 , Qt :: DashDotLine, Qt :: RoundCap)); painter. setBrush( QBrush ( Qt :: green, Qt :: SolidPattern)); painter. drawEllipse( 10 , 10 , 400 , 240 ); painter. drawRect( QRect ( 10 , 300 , 400 , 140 )); } 首先需要创建一个 QPainter ,将需要绘图的设备的指针传递给 QPainter 。 QPainter 有各种 draw…() 可以绘制不同的图形。画笔、画刷、字体是最重要的三种设置。 画笔用来画线和边缘, QPainter ::setPen() 可以对画笔进行设置,包括颜色、宽度、线型、拐点风格等。 画刷用来填充几何形状的图案, QPainter ::setBrush() 可以对画刷进行设置,包括颜色和纹理风格。 绘制文本时需要对字体进行设置, QPainter ::setFont() 对字体进行设置,包括字体族和磅值。 void Widget:: drawBezier() { QPainter painter( this ); painter. setRenderHint( QPainter :: Antialiasing, true ); QPainterPath path; path. moveTo( 10 , 320 ); path. cubicTo( 200 , 80 , 400 , 80 , 480 , 320 ); painter. setPen( QPen ( Qt :: black, 8 )); painter. setBrush( QBrush ( Qt :: green, Qt :: DiagCrossPattern)); painter. drawPath( path); } QPainterPath 可以通过连接基本的图形单元元素来确定任意的矢量形状,包括:直线、椭圆、多边形、弧形、贝赛尔曲线等。 首先使用 QPainter ::moveto() 来确定图形的起点,然后通过 cubicTo() 来确定绘制的线路。前 4 个参数确定了两个控制点,后两个参数是结束点的位置。 修改函数如下: void Widget:: drawBezier() { QPainter painter( this ); painter. setRenderHint( QPainter :: Antialiasing, true ); QPainterPath path; path. moveTo( 10 , 320 ); path. cubicTo( 200 , 80 , 400 , 80 , 480 , 320 ); painter. setPen( QPen ( Qt :: black, 2 )); painter. drawPath( path); painter. setPen( QPen ( Qt :: red, 4 )); painter. drawPoint( 10 , 320 ); painter. drawPoint( 200 , 80 ); painter. drawPoint( 400 , 80 ); painter. drawPoint( 480 , 320 ); } 画笔样式 为了尝试画笔的样式,这里故意使用了一个新的画笔: painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap)); 我们对照着API去看,第一个参数是画笔颜色,这里设置为黑色;第二个参数是画笔的粗细,这里是5px;第三个是画笔样式,我们使用了 DashDotLine,正如同其名字所示,是一个短线和一个点相间的类型;第四个是RoundCap,也就是圆形笔帽。然后我们使用一个黄色的画刷填充,画了一个椭圆。 后面的一个和前面的十分相似,唯一的区别是多了一句 painter.setRenderHint(QPainter::Antialiasing, true); 不过这句也很清楚,就是设置Antialiasing属性为true.如果你学过图形学就会知道,这个长长的单词就是"反走样".经过这句设置,我们就打开了QPainter的反走样功能。还记得我们曾经说过,QPainter是一个状态机,因此,只要这里我们打开了它,之后所有的代码都会是反走样绘制的了。 看到这里你会发现,反走样的效果其实比不走样要好得多,那么,为什么不默认打开反走样呢?这是因为,反走样是一种比较复杂的算法,在一些对图像质量要求不高的应用中,是不需要进行反走样的。为了提高效率,一般的图形绘制系统,如Java2D、OpenGL之类都是默认不进行反走样的。 还有一个疑问,既然反走样比不反走样的图像质量高很多,不进行反走样的绘制还有什么作用呢?前面说的是一个方面,也就是,在一些对图像质量要求不高的环境下,或者说性能受限的环境下,比如嵌入式和手机环境,是不必须要进行反走样的。另外还有一点,在一些必须精确操作像素的应用中,也是不能进行反走样的。请看下面的图片: 上图是使用Photoshop的铅笔和画笔工具画的1像素的点在放大到3200%视图下截下来的。Photoshop里面的铅笔工具是不进行反走样,而画笔是要进行反走样的。在放大的情况下就会知道,有反走样的情况下是不能进行精确到1像素的操作的。因为反走样很难让你控制到1个像素。这不是 Photoshop画笔工具的缺陷,而是反走样算法的问题。如果你想了解为什么这样,请查阅计算机图形学里面关于反走样的原理部分。 反走样是图形学中的重要概念,用以防止“锯齿”现象的出现。很多系统的绘图API里面都会内置了反走样的算法,不过默认一般都是关闭的,Qt也不例外。下面我们来看看代码。这段代码仅仅给出了paintEvent函数,相信你可以很轻松地替换掉前面章节中的相关代码。 void PaintedWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap)); painter.setBrush(Qt::yellow); painter.drawEllipse(50, 150, 200, 150); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap)); painter.setBrush(Qt::yellow); painter.drawEllipse(300, 150, 200, 150); } 声明:本文原创于yafeilinux的百度博客,http://hi.baidu.com/yafeilinux 转载请注明出处。 前面一节我们讲解了图片的显示,其中很多都用到了坐标的变化,这一节我们简单讲一下Qt的坐标系统,其实也还是主要讲上一节的那几个函数。这里我们先讲解一下Qt的坐标系,然后讲解那几个函数,它们分别是: translate()函数,进行平移变换;scale()函数,进行比例变换;rotate()函数,进行旋转变换;shear()函数,进行扭曲变换。 最后介绍两个有用的函数save()和restore(),利用它们来保存和弹出坐标系的状态,从而实现快速利用几个变换来绘图。 一、坐标系简介。 Qt中每一个窗口都有一个坐标系,默认的,窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小。原点即为(0,0)点,然后以像素为单位增减。 例如: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(Qt::red); painter.drawRect(0,0,100,100); painter.setBrush(Qt::yellow); painter.drawRect(-50,-50,100,100); } 我们先在原点(0,0)绘制了一个长宽都是100像素的红色矩形,又在(-50,-50)点绘制了一个同样大小的黄色矩形。可以看到,我们只能看到黄色矩形的一部分。效果如下图。 二、坐标系变换。 坐标系变换是利用变换矩阵来进行的,我们可以利用QTransform类来设置变换矩阵,因为一般我们不需要进行更改,所以这里不在涉及。下面我们只是对坐标系的平移,缩放,旋转,扭曲等应用进行介绍。 1.利用translate()函数进行平移变换。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(Qt::yellow); painter.drawRect(0,0,50,50); painter.translate(100,100); //将点(100,100)设为原点 painter.setBrush(Qt::red); painter.drawRect(0,0,50,50); painter.translate(-100,-100); painter.drawLine(0,0,20,20); } 效果如下。 这里将(100,100)点作为了原点,所以此时(100,100)就是(0,0)点,以前的(0,0)点就是 (-100,-100)点。要想使原来的(0,0)点重新成为原点,就是将(-100,-100)设为原点。 2.利用scale()函数进行比例变换,实现缩放效果。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(Qt::yellow); painter.drawRect(0,0,100,100); painter.scale(2,2); //放大两倍 painter.setBrush(Qt::red); painter.drawRect(50,50,50,50); } 效果如下。 可以看到,painter.scale(2,2),是将横纵坐标都扩大了两倍,现在的(50,50)点就相当于以前的 (100,100)点。 3.利用shear()函数就行扭曲变换。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(Qt::yellow); painter.drawRect(0,0,50,50); painter.shear(0,1); //纵向扭曲变形 painter.setBrush(Qt::red); painter.drawRect(50,0,50,50); } 效果如下。 这里,painter.shear(0,1),是对纵向进行扭曲,0表示不扭曲,当将第一个0更改时就会对横行进行扭曲,关于扭曲变换到底是什么效果,你观察一下是很容易发现的。 4.利用rotate()函数进行比例变换,实现缩放效果。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawLine(0,0,100,0); painter.rotate(30); //以原点为中心,顺时针旋转30度 painter.drawLine(0,0,100,0); painter.translate(100,100); painter.rotate(30); painter.drawLine(0,0,100,0); } 效果如下。 因为默认的rotate()函数是以原点为中心进行顺时针旋转的,所以我们要想使其以其他点为中心进行旋转,就要先进行原点的变换。这里的painter.translate(100,100)将(100,100)设置为新的原点,想让直线以其为中心进行旋转,可是你已经发现效果并非如此。是什么原因呢?我们添加一条语句,如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawLine(0,0,100,0); painter.rotate(30); //以原点为中心,顺时针旋转30度 painter.drawLine(0,0,100,0); painter.rotate(-30); painter.translate(100,100); painter.rotate(30); painter.drawLine(0,0,100,0); } 效果如下。 这时就是我们想要的效果了。我们加的一句代码为painter.rotate(-30),这是因为前面已经将坐标旋转了30度,我们需要将其再旋转回去,才能是以前正常的坐标系统。不光这个函数如此,这里介绍的这几个函数均如此,所以很容易出错。下面我们将利用两个函数来很好的解决这个问题。 三、坐标系状态的保护。 我们可以先利用save()函数来保存坐标系现在的状态,然后进行变换操作,操作完之后,再用restore()函数将以前的坐标系状态恢复,其实就是一个入栈和出栈的操作。 例如: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.save(); //保存坐标系状态 painter.translate(100,100); painter.drawLine(0,0,50,50); painter.restore(); //恢复以前的坐标系状态 painter.drawLine(0,0,50,50);
10.1 何为Qt样式表 由于Qt样式表的引入,定制Qt部件的外观样式变得非常简单。 Qt样式表的思想很大程度上是来自于HTML的层叠式样式表(CSS), 通过调用QWidget::setStyleSheet()或QApplication::setStyleSheet(), 你可以为一个独立的子部件、整个窗口,甚至是整个个应用程序指定一个样式表。 样式表是通过QStyle的一个叫做QStyleSheetStyle的特殊子类来实现的。 这个特殊的子类实际上是其他的系统特定风格类的包裹类,它会把通过样式表指定的自定义外观风格应用在底层的系统特定风格之上。 10.2 样式表语法基础 Qt样式表与CSS的语法规则几乎完全相同,如果你已经了解了CSS,完全可以跳过本节。 一个样式表由一系列的样式规则构成。每个样式规则都有着下面的形式: selector { attribute: value } 选择器(selector)部分通常是一个类名(例如QComboBox),当然也还有其他的语法形式。 属性(attribute)部分是一个样式表属性的名字, 值(value)部分是赋给该属性的值。 为了使用方便,我们还可以使用一种简化形式: selector1, selector2, ..., selectorM { attribute1: value1; attribute2: value2; ... attributeN: valueN; } 这种简化形式可以同时为与M个选择器相匹配的部件设置N种属性。 例如: QCheckBox, QComboBox, QSpinBox { color: red; //字体颜色:红 font: bold; } 这个规则设置了所有的QCheckBox、QComboBox和QSpinBox的前景色、背景色和字体。 10.3 方箱模型 在样式表中,每个部件都被看作是一个由四个同心相似的矩形组成的箱体: 空白(margin)、边框(border)、填充(padding)和内容(content)。 对于一个平面部件——例如一个空白、边框和填充都是0像素的部件——而言,这四个矩形是完全重合的。 空白区域位于边框外,并且总是透明的。 边框为部件提供了四周的框架,其border-style属性可以设置为一些内置的框架风格,如inset、outset、solid和ridge。 填充在边框和内容区域之间提供了空白间隔。 10.4 前景与背景 部件的前景色用于绘制上面的文本,可以通过color属性指定。 背景色用于绘制部件的填充矩形,可以通过background-color属性指定。 背景图片使用background-image属性定义,它用于绘制由background-origin指定的矩形区域(空白、边框、填充或内容)。背景图片在矩形区域内的对齐和平铺方式可以通过background-position和background-repeat属性指定。 QFrame { margin: 10px; border: 2px solid green; padding: 20px; background-image: url(qt.png); background-position: top right; background-origin: content; background-repeat: none; } 在这个例子中,QFrame四周的空白、边框和填充值都是一样的。 实际上margin属性可以在上下左右四个方向分别指定我们需要的不同值,例如: QFrame { margin: 14px 18px 20px 18px; } 同时,我们也可以分别指定margin-top、margin-right、margin-bottom、margin-left四个属性。 QFrame { margin-top: 14px; margin-right: 18px; margin-bottom: 20px; margin-left: 18px; } 虽然目前我们仅仅使用了QFrame作为例子,但是我们也可以同样的将这些属性应用于任何一个支持方箱模型的Qt部件,例如:QCheckBox、 QLabel、QLineEdit、QListView、QMenu、QPushButton、QTextEdit、和QToolTip。 10.5 可缩放样式 在默认情况下,通过background-image指定的背景图片会自动重复平铺,以覆盖部件的整个填充矩形(即边框里面的那个区域)。 ///注意区别: 如果我们想创建能够随着部件大小自动缩放而不是平铺的背景,我们需要设置一种称之为“边框图片”的东东。 注意 “边框图片”可以通过border-image属性指定,它同时提供了部件的背景和边框。 一个“边框图片”被分为九个部分(九宫格),有点向tic-tac-toe游戏的棋盘。 当一个部件的边框被填充时,四角的格子通常不会发生变化,而其余的五个格子则可能被拉伸或平铺以填充可用空间。 当指定一个“边框图片”时,除了图片本身,我们还必须指定用来分割九宫格的四条分割线。同时我们还必须指定非边角的格子是应该平铺还是拉伸,以及边框的宽度(用来确定边角格子的大小,防止边角被缩放变形)。 例如,下面的样式表定义了上图中的button: QPushButton { border-width: 4px; border-image: url(button.png) 4 4 4 4 stretch stretch; } 另外,“边框图片”还应该含有alpha通道,以使背景能够在边角处露出来。 10.6控制大小 min-width和min-height两个属性可以用来指定一个部件的内容区域的最小大小。 这两个值将影响部件的minimumSizeHint(),并在布局时被考虑。 例如: QPushButton { min-width: 68px; min-height: 28px; } 如果该属性没有被指定,最小大小将从部件的内容区域和当前样式中继承。 10.7 伪状态 部件的外观可以按照用户界面元素状态的不同来分别定义,这在样式表中被称为“伪状态”。例如,如果我们想在一个push button在被按下的时候具有sunken的外观,我们可以指定一个叫做 :pressed 的伪状态。 QPushButton { border: 2px outset green; } QPushButton:pressed { background: gray; }
pyqt4精彩实例讲解,适合pyqt4初级学习者,经供参考第6行创建了一个 QPush Button对象,并设置它的显示文木为“ Hello Kitty!",由于此处并 没有指定按钮的父窗体,因此以自己作为主窗凵 第7行调用show()方法,显示此按钮。控件被创建时,默认是不显示的,必须调用show() 区数来显示它。 第8行的 connect方法是αt最重要的特征,即信号与槽的机制。当按钮被按下则触发 clicked 信号,与之相连的 APplication对象的槽quit(响应按钮单击信号,执行退出应用程序的操 作。关于信号与槽机制在本实例最后将进行详细的分析。 最后调用 APplication的exec()方法,程序进入消息循环,等待可能输入进行响应。Qt 完成事件处理及显示的工作,并在应用程序退出时返叫exec_Q)的值 最后执行程序即可出现上图所示的对话框,一个简单的 Hello Kitty!例子完成。 信号与槽机制作为αt最重要的特性,提供了任意两个Qt对象之间的通信机制。其中,信 号会在某个特定情况或动作下被触发,槽是用于接收并处理信号的函数。例如,要将一个窗 口中的变化情况通知给另一个窗口,则一个窗口发送信号,另一个窗口的槽接收此信号并进 行相应的操作,即可实现两个窗∏之间的通信。这比传统的图形化程序采用回调函数的方式 实现对象间通信要简单灵活得多。每个Qt对象都包含预定的信号和槽,当一某一特定事件 发生时,一个信号被发射,与信号相关联的槽则会响应信号完成相应的处理。 信号与槽机制常用的连接方式为 connect(Object1, SIGNAL(signal), Object2, SLOT (slot) signal|为对象 Object1的信号,sot为对象 Object2的槽,Qt窗口部件都包含若十个预定 义的信号和若干个预定乂的槽。当一个类被继承时,该类的信号和槽也同时被继承。开始人 也可以根据需要定义自己的信号和槽。 信号与槽机制可以有多种连接方式,下图描述了信号与槽的多种可能连接方式。 Object 1 Object 2 signal 1 si巴nall signal 2 SeFa 2 slot 1 slot 1 lot 2 Object 3 signal 2 slot 1 slot 2 个信号可以与另一个信号相连 connect(object1, SIGNAL(signal1),Object2, SIGNAL(signal 1)) 即表示 Object11的信号1发射可以触发 Object2的信号1发射 2.表示一个信号可以与多个槽相连 connect(Object1, SIGNAL(signal2), Object2, SLOT(slot2)) connect(object1, SIGNAL(signal2), Object3. SLOT(slot1) 3表示同一个槽可以响应多个信号 connect(object1, SIGNAL(signal2), Object2, SLOT(slot2)) connect(object3, SIGNAL(signal2),object2, SLOT (slot2)) 注:本文基本上是经过改编的《 Linux窗口程序设计-Qt4精彩实例分析》一书的PyQt4for windows版本 可以这么写: b clicked. connect( app. quit) 这样就少了一些 hardcode的字符串了,更加 pythonic 实例2标准对话框的使用 分类:-PyQ42010-12-0310:342105人阅读评论(2)收藏举报 和人多数操作系统一样, Windows及Linuⅹ都提供了一系列的标准对话框,如文件选择, 字体选择,颜色选择等,这些标准对话框为应用程序提供了一致的观感。Qt对这些标准对 话框都定义了相关的类,这些类让使用者能够很方便地使用标准对话框进行文件,颜色以及 字体的选择。标准对话框在软件设计过程中是经常需要使用的。 αt提供的标准对话框除了本实例提到的,还有 QErrorMessage, QInputDialog, QMessage Box, QPrintDialog, QProcess Dialog等,这些标准对话框的使用在本书的后续 部分将会陆续介绍。 本实例主要演示上面几种标准对话框的使用,如下图所示 St andard dialog 文件对话框 颜色对话框 字体对话框 Hello wor1l! 在上图中,单击“文件对话框”按钮,会弹出文件选择对话框,选中的文件名将显示在右连, 单击“颜色对话栏”按钮,会弹岀颜色选择对话框,选中的颜色将显小在右边,单击“字体对话 框”按钮,会弹出字体选择对话框,选中的字体将更新右边显示的字符串。 实现代码如下: [python] view plaincopyprint? 1.*-* -coding: utf-8 2. from PyQt4.QtGui import 3. from PyQt4. QtCore import 4. import sys 6.QText Codec. setCodecForTr(QText Codec codec ForName(utf8")) 8 class Standard Dialog(QDialog) 9 10. def init (self, parent=None) 1. super(StandardDialog, self). init (parent) 12 13. self. setWindow Title( Standard Dialog") 14 15. file Push Button= QPush Button(sefr("文件对话恒") 16 colorPushButton= QPush Button( self.tr-色对话框") font PushButton= QPushButton( self.tr("字体对话框") 19 self. fileLine Edit=QLine Edito self. colorFrame=QFrame( 21 self. colorFrame setFrame Shape(QFrame. Box) 22 self. colorFrame.setAutoFillBackground(True 23. self. fontAine Edit=QLine Edit( Hello World! " 24 25 layout=Q GridLayouto 26 layout. addWidget(filePushButton, 0, 0) layout. addWidget(self. fileLineEdit, 0, 1) 28 layout. addWidget(color PushButton, 1, 0) 29 layout. addWidget(self. colorFrame, 1,1) 30. layout. addWidget(fontPush Button, 2,0) layout. addWidget(self. fontLineEdit, 2, 1) 32 33. self. setLayout(layout) 34 35. self connect(filePushButton, SIGNALCclickedo"), self. open File) 36 self connect(colorPushButton, SIGNAL(clicked(), self. open Color) 37. self connect(fontPush Button, SIGNAL(clicked("), self. openFont) 38 39. def open File(self) 40. s=QFile Dialog getOpen FileName(self, Open file dialog","/","Python files( py)") 42. self. fileLineEdit. setText(str(s)) 43 44. def open Color(selt 45 46. c=Q Color Dialog. get Color(Qt. blue 47. if c is Valid(: 48. self. colorFrame. setPalette(QPalette(c)) 49 50. def open Font(self) 51 52 f, ok=QFontDialog getFont 53 if ok. 54 self. fontLineEdit setFont(f) 55 56. app=QApplication(sys. argv) 57 form= StandardDialogo 58 form. showO 69. app. exec O 第6行设定tr方法使用u邯8编码来解析文字。 第13行设置程序的标题。 第15到17行创建各个按钮控件。 第19行创建一个 LIne edit类实例 filelineedit,用米显示选择的文件名。 第20行创建一个 FRame类实例 doorframe,当用户选择不同的颜色时, color frame会 根据用户选择的颜色更新其背景 第23行创建一个 QLine Edit类实例 fontaine edit.,当用户选择不同的字体时, fontaine edit 会根据用户选择的字体更新其内容。 第25到33行将各个控件进行布局 第35到37行将各个按钮的 clicked信号相应的槽进行连接 sottIle(方法是文件对话框按钮的 clicked信号的槽,其中 getopenFileName()是 QFileDialog类的一个静态方法,返回用户选择的文件名,如果用户选择取消,则返回一个 空串。函数形式如下: QString getopen FileName(QWidget parent= None, QString caption= QString(, Q String directory = QString(, QString filter= QString(, Options options =0) QString getOpen FileName(QWidget parent None, QString caption QString(, QString directory= QString(), QString filter=QStringo, QString selectedFilter= None, Options options = 0) 调用 getOpen FileName(函数将创建一个模态的文件对话框,如下图所示。 directory参数 指定了默认的目录,如果 directory参数带有文件名,则该文件将是默认选中的文件,fter 参数对文件类型走行过滤,只有与过滤器匹配的文件类型才显示, filter可以同时指定多种 过滤方式供用户选择,多种过滤器之间用";"隔开,用广选择的过滤器通过参数 selectedFilter 返回 Open file dialog ②区 查找范围):「本地避盘(:) OMy Book My Doc 我最近的文档yFim @My Hidden aMy Music 桌面 laMy Othe oMy Pic 品 7 Softwa 我的文档 My Study aMy Work 我的电脑 网上邻居 文件名① [打开@)1 文件类型): Python files(,py) 取消 QFileDialog类还提供了类似的其他静态函数,如卜表,通过这些函数,用户可以方使地定 制自己的文件对话框。 静态函数 说明 ge lOpenFilename 获得用户选择的文件名 getsaveFileName 获得用户保存的文件名 getExistingdirectory 获得用户选择的已存在的目录名 getOpenl'ileNames 获得用户选择的文件名列表 slotcolor()函数是颜色对话框按钮 clicked信号的槽。其中 decolor()是 QColorDialog的 个静态函数,返回用户选择的颜色值,函数形式如下: QColor Q Dialog getColor(Q Color initial=Qt. white, QWidget parent= None) QColor Q Color Dialog. getColor(QColor, QWidget, QString, Color DialogOptions options 0 调用 getcolor(函数将创建一个模态的颜色对话框,如下图所示。 initial参数指定了默认的 颜色,默认为白色,通过 is valid(可以判断用户选择的颜色是否有效,若用户选择取消, isValid将返回 false Select Font 冈 Font Font style eIze Normal 仿宋GB2312 Normal 华文中宋 工 telic 华文仿 Bold 8 华文宋体 Bold italic 9 华文彩云 10 华文新魏 11 华文楷体 12 华文琥珀 华文细黑 1日 文 18 华文隶书 2 2在-1Rnn 4 E£ Eects Sample □ Strikeout 口 nderline AaBblyLr Writing System ty OK[ Cancel slotFont()函数是字体对话框按钮 clicked信号的槽。其中 getFont(是 QFontDialog的个 静态函数,返回用户选择的字体,函数形式如下: (QFont, bool) getFont(QFont, QWidget, QString, FontDialogOptions) (QFont, bool) getFont(QFont, QWidget, QString) (QFont, bool) getFont(QFont, QWidget parent= None) (QFont, bool) getFont(QWidget parent = None 调用 getFont()函数将创建个模态的字体对话框,如下图所示。用户选择OK,函数返回(用 户选择的字体True)否则返回(默认字体, False) ■ Select font Font Font styl Size 宋体 Normal 仿宋GB2312 orm 文中宋 工taic 华文仿 Bold 8 华文宋体 Bold italic 9 10 华文新魏 11 华文楷体 12 华文琥 华文细 1日 18 华文隶 2 22 宋体-1Rn3n Effects ample □ Strikeout □nler1ine AaBbyyli Writing System Any 匚[caca 实例3各类位置信 分类:-PyQt42010-12-0417:071226人阅读评论()收藏举报 Qt提供了很多关于获取窗体位置及显示区域大小的函数,本实例利用一个简单的对话框显 示窗体的各种位置信息,包括窗体的所在点位置,长,宽信息等。木实例的目的是分析各个 有关位置信息的函数之间的区别,如x(,yO,posO),rect), size(), geometry)等,以及在不同的 情况下应使用哪个函数来获取位置信息。实现的效果如下图

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧