qt中setViewport如何理解!

看来一篇文章感觉有点问题http://www.cnblogs.com/realid/archive/2013/05/05/3061312.html,于是自己测试了下,终于得到了满意的答案:

widget.h文件

#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();

protected:
    void paintEvent(QPaintEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H


widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QToolTip>
#include <QMouseEvent>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setMouseTracking(true);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setPen(QPen(Qt::red, 3));
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawRect(0, 0, 200, 200);
    painter.setViewport(0, 0, 200, 200);
    painter.drawRect(0, 0,200,200);

}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    QString pos = QString("%1,%2").arg(event->pos().x()).arg(event->pos().y());
    QToolTip::showText(event->globalPos(), pos, this);
}



 main.cpp 

#include <QApplication>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

新建工程拷贝上面代码,运行,然后拖动,实验一下情形:

1.把窗口拖得跟大矩形一样大(发现小的正好是大的一半)

2.把窗口拖大(小矩形变小)

3.把窗口拖小(小矩形变大)

为什么会这样呢?其实viewport设置的是一个视口(大矩形),他就是窗口(你拖动的那个)的一个映射.比如设置(0,0,200,200),他就将窗口的左上角映射到视口的左上角(0,0),窗口的右下角映射到视口的右下角.

于是当你把窗口拖大,那么小矩形如果画在窗口里,相对于窗口是不是会显得小(比例),但是现在要画在视口里,因为视口大小固定,于是只有把小矩形变小,这样才能体现小矩形和窗口的关系


注意要区别于setWindow(0,0,200,200),他是将视口映射到窗口.二者关系很微妙!需要细心体会...

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值