1.项目说明
此项目是在开发机器人控制地图过程中的小例子。
要求:1.地图过大时,通过滚动条控件Scroll Area进行滚动;
2.地图坐标是相当于控件的,不是整个界面;
3.点击一下添加一个按钮,并且按钮是固定的;
2.实现
1.在ui界面添加控件
首先在UI界面添加图片中的控件,可以根据自己需求添加,添加Scroll Area是因为地图过大需要通过鼠标控制,label主要是用来显示地图的。
2.固定坐标
添加下面代码可以使滚动条滚动坐标点的坐标不变(大概是这个意思!)
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
//为了使用滚动条滚动坐标点的坐标固定不动
ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
}
3.点击获取位置坐标
鼠标点击获取坐标点,每一行代码都有注释,自行参考根据自己需求更改。
void Form::mouseReleaseEvent(QMouseEvent *event) //不能使用点击事件,因为和提升界面MyLabel相冲突
{
//利用QImage获取图片的像素点长度宽度
QImage image(filename);
//把坐标点固定不动赋值给sx、sy
sx=ui->scrollArea->horizontalScrollBar()->value();
sy=ui->scrollArea->verticalScrollBar()->value();
//获取坐标点,+sx和sy是为了使坐标点固定,-130和-60是因为坐标是相对于滚动条的,不是Qlabel
x1=QString("%1").arg(event->x()+sx-image.width()-130);
y1=QString("%2").arg(event->y()+sy-60);
//先把x坐标转换成int类型,然后在换成正方向
QString a(x1);
int t=a.toInt();
int x2=0;
x2=-t;
//把坐标点显示在pushbutoon
ui->pushButton_2->setText(QString("( x= %1 , y= %2 )").arg(x2).arg(y1));
//ui->label_3->setText(tr("(%1,%2)").arg(event->x()+sx-612).arg(event->y()+sy-42));
//获取坐标点T,N -130和-60是因为坐标是相对于滚动条的,不是Qlabel
T=QString("%1").arg(event->x()+sx-130);
N=QString("%2").arg(event->y()+sy-60);
}
4.添加按钮
void Form::on_pushButton_3_clicked() //添加标点(按钮)按钮
{
//把坐标T,N转换成int类型坐标t,n(T,N是为了使按钮显示在点击的坐标【原点:左上角】)
QString a(T);
int t = a.toInt();
QString b(N);
int n = b.toInt();
//新建一个Qpushbtoon
QPushButton *btn = new QPushButton();
ui->gridLayout->addWidget(btn);
btn->setGeometry(t,n,20,20);
btn->setParent(ui->label);
}
通过以上代码就可以实现点击一下添加一个按钮,并且按钮固定不动。
注:qt菜鸟一枚,如有错误,欢迎指出。