我想在多边形中绘制多边形QGraphicsScene
但多边形具有纬度/经度位置.在一个equirectangular投影中,坐标来自:
^
90
|
|
-180----------------------------------->180
|
|
-90
Run Code Online (Sandbox Code Playgroud)
如何设置QGraphicsScene
/ QGraphicsView
到这样的投影?
非常感谢,
卡洛斯.
我将QGraphicsScene子类化,并添加方法mouseMoveEvent来处理鼠标移动事件.我在GraphicsView上创建了一个标尺,并使用标尺跟踪鼠标移动.在QGraphicsScene :: mousemoveEvent中,我将expliitely调用标尺小部件的mouseMoveEvent.目的是让标尺知道当前的鼠标位置.
现在,当我移动鼠标时,似乎没有调用QGraphicsScene :: mousemoveEvent.但是,如果我按住鼠标左键并按住按钮移动它,我可以使它工作.这不是我想看到的; 每当我将鼠标放在视图上并移动鼠标时,我都会调用此方法.
有没有解决方法?
我有以下代码来设置QGraphicsScene
.我希望点击场景并在我点击的位置画一个点.我怎么能这样做?这是我目前的代码:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QGraphicsScene *scene;
QGraphicsView *view = new QGraphicsView(this);
view->setGeometry(QRect(20, 50, 400, 400));
scene = new QGraphicsScene(50, 50, 350, 350);
view->setScene(scene);
}
Run Code Online (Sandbox Code Playgroud) 我对Qt很新.我在插入QImage
场景时遇到了麻烦.有人可以告诉我如何添加QImage
到QGraphicsScene
?
使用下面的代码片段,我创建了一个包含100.000个矩形的场景.
表现很好; 视图没有延迟响应.
QGraphicsScene * scene = new QGraphicsScene;
for (int y = -50000; y < 50000; y++) {
scene->addRect(0, y * 25, 40, 20);
}
...
view->setScene(scene);
Run Code Online (Sandbox Code Playgroud)
而现在第二个片段很糟糕
for (int y = 0; y < 100000; y++) {
scene->addRect(0, y * 25, 40, 20);
}
Run Code Online (Sandbox Code Playgroud)
对于场景元素的前半部分,视图延迟响应鼠标和键事件,而另一半看起来似乎没问题?!?
前一场景有sceneRect(x,y,w,h)=(0,-1250000,40,2499995).
后一场景有sceneRect(x,y,w,h)=(0,0,40,2499995).
我不知道为什么sceneRect会影响性能,因为BSP索引是基于相对项目坐标的.
我错过了什么吗?我没有找到关于文档的任何信息,加上Qt演示40000 Chips还在(0,0)周围分发元素,而没有解释该选择的原因.
// Populate scene
int xx = 0;
int nitems = 0;
for (int i = -11000; i < 11000; i += 110) {
++xx;
int yy …
Run Code Online (Sandbox Code Playgroud) 我是Qt/Embedded的新手.我想用它QPainter
来绘制一个东西QPixmap
,它将被添加到QGraphicsScene
.这是我的代码.但它没有在像素图上显示图纸.它只显示黑色像素图.
int main(int argc, char **argv) {
QApplication a(argc, argv);
QMainWindow *win1 = new QMainWindow();
win1->resize(500,500);
win1->show();
QGraphicsScene *scene = new QGraphicsScene(win1);
QGraphicsView view(scene, win1);
view.show();
view.resize(500,500);
QPixmap *pix = new QPixmap(500,500);
scene->addPixmap(*pix);
QPainter *paint = new QPainter(pix);
paint->setPen(*(new QColor(255,34,255,255)));
paint->drawRect(15,15,100,100);
return a.exec();
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个自定义QGraphicsItem
.并覆盖boundingRect()
和paint()
.
QRectF myTile::boundingRect() const
{
return QRectF(xPos*10, yPos*10, 10, 10);
}
void myTile::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QRectF rec = boundingRect();
int gvi = value * 255;
QColor gv(gvi, gvi, gvi, 255);
QBrush brush(gv);
painter->fillRect(rec, brush);
painter->drawRect(rec);
}
Run Code Online (Sandbox Code Playgroud)
然后我用来addItem()
向场景添加一个项目.现在我想通过它的位置从现场得到它.我找到了这个itemAt
功能.但问题是我不知道const QTransform
&是什么deviceTransform
.我该QTransform
怎么用?
因为我没有实现任何变换QGraphicsItem
.这让我很困惑.
我正在尝试理解QGraphicsView和QGraphicsScene,特别是如何放置图形项目并将它们显示在我想要的位置.如果场景大于观看区域,我也会在滚动条出现时感到困惑.
例如,这段代码将在顶角创建一个带有椭圆的小图形视图:
import sys
from PyQt4 import QtGui, QtCore
class MyView(QtGui.QGraphicsView):
def __init__(self):
QtGui.QGraphicsView.__init__(self)
self.scene = QtGui.QGraphicsScene(self)
self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245))
self.setScene(self.scene)
self.item = QtGui.QGraphicsEllipseItem(0, 0, 60, 40)
self.scene.addItem(self.item)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
view = MyView()
view.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
但是,如果self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245))
省略,则即使椭圆具有x,y = 0,0,椭圆也会出现在窗口的中间.我不知道为什么!这种行为有原因吗?
同样,当场景大小大于视图时,我对滚动条的外观感到困惑.例如,以下代码创建一个带有多个椭圆的视图/场景,并且itemsBoundingRect
大于sceneRect
.仅显示了一些省略号,但没有滚动条可以看到隐藏的省略号,您必须增加窗口的大小.但是当你这样做时,椭圆的位置会发生偏移,因此忽略椭圆的x,y.
import sys
from PyQt4 import QtGui, QtCore
class MyView(QtGui.QGraphicsView):
def __init__(self):
QtGui.QGraphicsView.__init__(self)
self.setGeometry(QtCore.QRect(100, 100, 250, 250))
self.scene = QtGui.QGraphicsScene(self)
self.scene.setSceneRect(QtCore.QRectF(0, 0, 200, 200))
self.setScene(self.scene)
for i …
Run Code Online (Sandbox Code Playgroud) 以下代码应创建QGraphicsView小部件,该小部件拥有一个QGraphicsScene,其中包含文本:
#!/usr/bin/python
import sys
from PyQt4.QtGui import *
if __name__ == '__main__':
app = QApplication(sys.argv)
view = QGraphicsView()
scene = QGraphicsScene()
scene.addText("Hello!")
view.setScene(scene)
view.show();
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
这将打开窗口,将文本放在那里,但在关闭窗口后 - python转储核心并打印出几个问题:
(python:5387): Gtk-CRITICAL **: IA__gtk_container_add: assertion `GTK_IS_CONTAINER (container)' failed
(python:5387): Gtk-CRITICAL **: IA__gtk_widget_realize: assertion `GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed
...clip...
... above message is shown many, many times ...
...clip...
(python:5387): Gtk-CRITICAL **: IA__gtk_widget_realize: assertion `GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
版本:python2.7 2.7.3-0ubuntu3.1 python-qt4 4.9.1-2ubuntu1
我有一个类实例需要由其他一些类访问.
error: calling a private constructor of class 'Foo'
要在QGraphicsView框架的上下文中进一步指定问题:我想添加QGraphicsItems,它由控制器类(管理项目)实例化到QGraphicsScene,这是(但我不坚持这个细节)我的成员QMainWindow类.
我花了相当多的时间在互联网上搜索,但我相当新,我有点被困在这里.对于解决困境的最佳方法,我表示赞赏.
qgraphicsscene ×10
qt ×7
c++ ×3
pyqt4 ×2
global ×1
performance ×1
projection ×1
pyqt ×1
python ×1
python-2.7 ×1
qimage ×1
qobject ×1
qpainter ×1
qpixmap ×1
qt4 ×1
static ×1