如何从局部图形坐标(Qt,QCustomPlot)中获取以像素为单位的全局坐标
How to get global coord in pixel from local graphic coord (Qt, QCustomPlot)
我想将相对于 window 的局部坐标转换为以像素为单位的全局坐标。
我看到了如何从全球到本地的例子。它使用
ui->customPlot->xAxis->pixelToCord(0)
但是
ui->customPlot->xAxis->coordToPixel(0)
不工作。
这里我使用按钮调试结果。红色是按钮必须的。蓝色是按钮。
图片link
void MainWindow::makePlot(){
// generate some data:
QVector<double> x(101), y(101); // initialize with entries 0..100
for (int i=0; i<101; ++i)
{
x[i] = i/50.0 - 1; // x goes from -1 to 1
y[i] = x[i]*x[i]; // let's plot a quadratic function
}
// create graph and assign data to it:
ui->customPlot->addGraph();
ui->customPlot->graph(0)->setData(x, y);
// give the axes some labels:
ui->customPlot->xAxis->setLabel("x");
ui->customPlot->yAxis->setLabel("y");
// set axes ranges, so we see all data:
ui->customPlot->xAxis->setRange(-1, 1);
ui->customPlot->yAxis->setRange(0, 1);
ui->customPlot->replot();
double real_x = ui->customPlot->xAxis->coordToPixel(0) + ui->customPlot->x();
double real_y = ui->customPlot->yAxis->coordToPixel(0) + ui->customPlot->y();
QPoint real_cord(real_x, real_y);
button->setGeometry(QRect(real_cord, QSize(20,20)));
}
小部件的位置是相对于 parent 小部件的,如果它没有 parent 则它是相对于屏幕的。所以建立一个合适的parent很重要,在这种情况下一个好的选择是使用parent到ui->customPlot
。
另一方面,coordToPixel()
方法要求显示小部件,因此使用 showEvent()
是一个不错的选择,在更改 window 的大小时也是如此也会更改这些坐标,因此它也会使用 resizeEvent()
.
*.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
button = new QPushButton("test", ui->customPlot);
...
ui->customPlot->replot();
}
void MainWindow::moveButtonFromCoord()
{
double real_x = ui->customPlot->xAxis->coordToPixel(0);
double real_y = ui->customPlot->yAxis->coordToPixel(0);
QRect geo = button->geometry();
geo.moveCenter(QPoint(real_x, real_y));
button->setGeometry(geo);
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
moveButtonFromCoord();
QMainWindow::resizeEvent(event);
}
void MainWindow::showEvent(QShowEvent *event)
{
moveButtonFromCoord();
QMainWindow::showEvent(event);
}
...
完整的示例可以在下面link.
中找到
我想将相对于 window 的局部坐标转换为以像素为单位的全局坐标。
我看到了如何从全球到本地的例子。它使用
ui->customPlot->xAxis->pixelToCord(0)
但是
ui->customPlot->xAxis->coordToPixel(0)
不工作。
这里我使用按钮调试结果。红色是按钮必须的。蓝色是按钮。
图片link
void MainWindow::makePlot(){
// generate some data:
QVector<double> x(101), y(101); // initialize with entries 0..100
for (int i=0; i<101; ++i)
{
x[i] = i/50.0 - 1; // x goes from -1 to 1
y[i] = x[i]*x[i]; // let's plot a quadratic function
}
// create graph and assign data to it:
ui->customPlot->addGraph();
ui->customPlot->graph(0)->setData(x, y);
// give the axes some labels:
ui->customPlot->xAxis->setLabel("x");
ui->customPlot->yAxis->setLabel("y");
// set axes ranges, so we see all data:
ui->customPlot->xAxis->setRange(-1, 1);
ui->customPlot->yAxis->setRange(0, 1);
ui->customPlot->replot();
double real_x = ui->customPlot->xAxis->coordToPixel(0) + ui->customPlot->x();
double real_y = ui->customPlot->yAxis->coordToPixel(0) + ui->customPlot->y();
QPoint real_cord(real_x, real_y);
button->setGeometry(QRect(real_cord, QSize(20,20)));
}
小部件的位置是相对于 parent 小部件的,如果它没有 parent 则它是相对于屏幕的。所以建立一个合适的parent很重要,在这种情况下一个好的选择是使用parent到ui->customPlot
。
另一方面,coordToPixel()
方法要求显示小部件,因此使用 showEvent()
是一个不错的选择,在更改 window 的大小时也是如此也会更改这些坐标,因此它也会使用 resizeEvent()
.
*.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
button = new QPushButton("test", ui->customPlot);
...
ui->customPlot->replot();
}
void MainWindow::moveButtonFromCoord()
{
double real_x = ui->customPlot->xAxis->coordToPixel(0);
double real_y = ui->customPlot->yAxis->coordToPixel(0);
QRect geo = button->geometry();
geo.moveCenter(QPoint(real_x, real_y));
button->setGeometry(geo);
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
moveButtonFromCoord();
QMainWindow::resizeEvent(event);
}
void MainWindow::showEvent(QShowEvent *event)
{
moveButtonFromCoord();
QMainWindow::showEvent(event);
}
...
完整的示例可以在下面link.
中找到