C++ GUI Programming with Qt4 (四)

Chapter 5.创建自定义Qt窗口部件

5.1 自定义窗口部件

一个简单而直接的解决方法就是对相关的窗口部件类进行子类化并且使它能够满足我们的需要。可以遵从一个相同模式:选择一个合适Qt窗口部件,对它进行子类化,并且通过重新实现一些虚函数来改变它的行为即可。

5.2 子类化QWidget

通过对现有窗口部件的组合构建而成的自定义,窗口部件通常都可以在Qt设计师中开发出来:

  • 使用“Widget”模板创建一个新窗体;
  • 把一些必须的窗口不见添加到这个窗体上,并且对其进行摆放;
  • 设置一些信号和槽的连接。
  • 如果通过信号和槽不能获得所需的行为,则只需在类中添加一些必要的代码即可。

Qt提供了两种存储颜色的类型:QRgb和QColor。

当产生-一个绘制事件并且调用paintEvent()函数的时候,会出现如下几种情况:
- 在窗口部件第一次显示时,系统会自动产生一个绘制事件,从而强制绘制这个窗口部件本身。
- 当重新调整窗口部件大小的时候,系统也会产生一个绘制事件。
- 当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一个绘制事件(除非这个窗口系统存储了整个区域)。

也可以通过调用 QWidget::update()或者 QWidget::repaintO()来强制产生一个绘制事件。这两个函数之间的区别是:repaint() 函数会强制产生二个即时的重绘事件,而update()函数则只是在Qt下一次处理事件时才简单地调用一个绘制事件。

Qt窗口部件的左上角处的位置坐标是(0,0),右下角的位置坐标是(width()-1,height()-1)。

5.3在Qt Designer中集成自定义窗口部件

有两种方法可以完成这一任务:改进法(ptomotion)和插件法(plugin) 。
改进法的缺点是:在Qt设计师中,无法对自定义窗口部件中的那些特定属性进行访问,并且也无法对这个窗口部件自身进行绘制。
插件法需要创建一个插件库,Qt设计师可以在运行时加载这个库,并且可以利用该库创建窗口部件的实例。在实现该插件类的源文件的末尾,必须使用亿口PORT PLUGIN2() 宏,从而可以在 Qt 设计师中使用这个插件。第一个参数是希望给插件的名字,第二个参数是实现该插件类的名字。

5.4双缓冲

双缓冲(double buffering)是一种图形用户界面编程技术,它包括把一个窗口部件渲染到一个脱屏像素映射(off-screen pixmap)中以及把这个像素映射复制到显示器上。把窗口部件固定不变地存储成一个像素映射,这样就总可以为下一个绘制事件做好准备,并且一旦收到绘制事件,就可以把这个像素映射复制到窗口部件上。例:

void Plotter::refreshPixmap()
{
    pixmap = QPixmap(size());
    pixmap.fill(this, 0, 0);

    QPainter painter(&pixmap);
    painter.initFrom(this);
    /*绘制任务*/
    drawGrid(&painter);
    drawCurves(&painter);
    /*预约下一次绘制事件*/
    update();
}
void Plotter::paintEvent(QPaintEvent * /* event */)
{
    QStylePainter painter(this);
    painter.drawPixmap(0, 0, pixmap);
    ......
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值