获得带滚动条界面的坐标前提知识为:
1.鼠标事件QT键盘鼠标事件
2.新建带滚动条界面QT新建带滚动条界面的两种方式
获得带滚条界面的坐标与获得主界面坐标的区别,就在于我们需要获得滚动条滑过的距离,并通过这个距离实现坐标系的变换。
1.新建工程
基类类型选择为QWidget
在ui界面拖入一个pushButton
2.修改.h文件
引入头文件QMouseEvent、QScrollArea、QScrollBar
引入虚函数void mousePressEvent(QMouseEvent *e);
定义几个变量:s,w,sx,sy分别为带滚动条的主界面、实际界面,横竖滚动条移动的距离。
代码如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMouseEvent>
#include <QScrollArea>
#include <QScrollBar>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QScrollArea *s;
QWidget *w ;
int sx=0,sy=0;
private:
Ui::Widget *ui;
protected:
void mousePressEvent(QMouseEvent *e);
};
#endif // WIDGET_H
3.修改widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
s = new QScrollArea(this);
s->setGeometry(100,100,200,200);
s->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
s->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
s->setWidgetResizable(false);
w = new QWidget(s);
w->setGeometry(0,0,400,400);
s->setWidget(w);
}
Widget::~Widget()
{
delete ui;
}
void Widget::mousePressEvent(QMouseEvent *e)
{
sx=s->horizontalScrollBar()->value();
sy=s->verticalScrollBar()->value();
ui->pushButton->setText(tr("(%1,%2)").arg(e->x()+sx-100).arg(e->y()+sy-100));
}
构造函数里定义s和w的界面参数,并把w设定为s的widget。
鼠标按下函数中通过获得横竖滚动条走过的value对最终显示坐标进行修改。
将横竖滚动条分别拖到最右端和最下端,点击右下角的点,显示坐标。
效果如下:
本文结束,下一篇讲QT坐标系的转换和如何在pixmap上绘制。