红联Linux门户
Linux帮助

Linux编程开发:用QT创作Skin

发布时间:2006-11-20 09:24:04来源:红联作者:hlMiracle
  软件界面的风格变化可以通过两种机制完成,一种是通过设置主题(Themes),它使用 界面库本身所具有的对界面组件(Components)的控制能力切换显示风格;另外一种是 通过提供不同系列的图片来切换显示界面,即这里所讲的 Skin。

  制作表皮有几个重要的因素值得考虑:

  1. 使用无边界的窗口

  在 XWindow 下,无边界的窗口是指不受窗口管理器管理的边界不规则的窗口。由于 不受窗口管理器管理管理,所以软件窗口界面没有附加的标题条(Title Bar)等。 在Qt中,建立无边界窗口的最简单的方法 是设置 QWidget 的 WFlags 的值是 WStyle_NoBorder。它定义在 qnamespace.h 中。 不规则窗口的特点则要求对整个 窗口使用图像掩码。使用 X 窗口形状的扩展(X Shape Extension)来达到要求。在 Qt 中可以直接使用,

引用:
  QBitmap bm;
  bm = *(Pixmaps[MASK]);
  setMask(bm);
  setBackgroundPixmap(*Pixmaps[BACKGROUND]);


  2. 窗口的移动

  由于上述窗口不受窗口管理器的管理的特性,所以移动窗口需要特殊处理,一般的 方法是截取根Widget的鼠标按钮事件,自己处理鼠标点击和移动的事件。
 
引用:
  void SkinDemo::mouseMoveEvent(QMouseEvent *e)
  {
  QPoint newpos = e->globalPos();
  QPoint upleft = pos0 + newpos - last;
  move(upleft);
  }
  
  void SkinDemo::mousePressEvent(QMouseEvent *e)
  {
  last = e->globalPos();
  pos0 = e->globalPos() - e->pos();
  }


  这里我们取得的鼠标位置是绝对位置,即相对于根窗口的位置,同时也记录下窗口 左上角的位置,当鼠标移动时,取得新的绝对位置,则窗口左上角 的新位置应该 是原来位置与鼠标移动的位置之差。
文章评论

共有 1 条评论

  1. hlMiracle 于 2006-11-20 09:24:30发表:

      3. 按钮的制作

      对于表皮中的图像按钮,设置它的父类是 QButton,这种按钮由两幅图片构成, 一幅图片是正常状态(Normal),一幅图片是按钮按下时的状态(Activated)。有时 也可以设置成四种状态,即增加禁止状态(Disabled)和鼠标指针进入时的状态 (Hovered)。

      在例子(qt-skin-example.tar.gz)中,我们重新定义了鼠标按下和鼠标移动的事件处理 函数, 并且含有按钮的所有信息,主工作区的所有信息等。主工作区的信息是它的 位置和尺寸,主窗口的信息是它所使用的背景图片和图片的掩码(用来制造不规则窗 口),所以整个主窗口的大小可以由图片的尺寸来决定。几个按钮的信息包含它们的 位置,它们的大小由图片的大小来决定。