标签: qgraphicsscene

Qt mousemoveevent + Qt :: LeftButton

快速问题,为什么:

void roiwindow::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{ 
    QGraphicsScene::mouseMoveEvent(event);
    qDebug() << event->button();
}
Run Code Online (Sandbox Code Playgroud)

当我在图形中移动光标的同时按住鼠标左键时,返回0而不是1.反正有没有让它返回1所以我可以告诉用户何时在图形切片上拖动鼠标.谢谢.

qt mouseevent qgraphicsscene

5
推荐指数
2
解决办法
6034
查看次数

使用QGraphicsScene :: addItem将QPixmap项添加到QGraphicsScene会导致PySide崩溃

我试图将图像添加到QGraphicsView/ QGraphicsScene后来我可以根据用户的输入在其上绘制简单的几何图形.QGraphicsView无论宽高比如何,我都需要确保图像适合.为此,我正在使用QGraphicsView::fitInView

工作版本:

如果我使用,我可以成功添加,显示和调整图像 QGraphicsScene::addPixmap

from PySide import QtGui
import sys
app = QtGui.QApplication(sys.argv)

scn = QtGui.QGraphicsScene()
view = QtGui.QGraphicsView(scn)

pixmap = QtGui.QPixmap("image.png")
gfxPixItem = scn.addPixmap(pixmap)

view.fitInView(gfxPixItem)
view.show()

sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

非工作版本:

然而,如果不是使用QGraphicsScene::addPixmap,我先创建一个QGraphicsPixmapItem,并用它添加到场景中QGraphicsScene::addItem,我收到了段错误!

from PySide import QtGui
import sys

app = QtGui.QApplication(sys.argv)
scn = QtGui.QGraphicsScene()
view = QtGui.QGraphicsView(scn)

pixmap = QtGui.QPixmap("image.png")
pixItem = QtGui.QGraphicsPixmapItem(pixmap)
gfxPixItem = scn.addItem(pixItem)

view.fitInView(gfxPixItem) # Crashes, see below for call stack in OSX
view.show() …
Run Code Online (Sandbox Code Playgroud)

python qt qgraphicsview pyside qgraphicsscene

5
推荐指数
1
解决办法
6084
查看次数

修复了 QGraphicsView 中的变换叠加

在我正在开发的基于 Qt 的应用程序中,我使用 QGraphicsView 在 2D 网格中显示传感器数据。在侧面,我想显示一个图例/调色板,将网格中的颜色与值相关联。

用户可以缩放和平移传感器数据视图,但可以理解的是,调色板应该在视图中固定。因此,将调色板/图例放置在传感器视图场景中需要一些额外的注意:应用逆用户变换。

不过,我宁愿将调色板/图例实现为一种(非交互式)覆盖层,并具有自己的转换。这有可能吗?

overlay transform qt4 qgraphicsview qgraphicsscene

4
推荐指数
1
解决办法
3240
查看次数

QGraphicsScene在QGraphicsView中奇怪地缩放

我正在搞乱QGraphicsViewQGraphicsScene创建一个Tic Tac Toe克隆.我在QGraphicsLineItem场景中添加一些s并覆盖resizeEvent包含视图的Widget 的方法,这样当调整窗口大小时,视图及其内容将被适当缩放.这工作正常,除了我第一次运行程序:

缩放不正确

一旦我按任意数量调整窗口大小,场景就会正确缩放:

正确缩放

这是代码:

main.cpp中:

#include <QtGui>

#include "TestApp.h"

int main(int argv, char **args)
{
    QApplication app(argv, args);

    TestApp window;
    window.show();

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

TestApp.h:

#ifndef TEST_APP_H
#define TEST_APP_H

#include <QtGui>

class TestApp : public QMainWindow
{
    Q_OBJECT
public:
    TestApp();
protected:
    void resizeEvent(QResizeEvent* event);

    QGraphicsView* view;
    QGraphicsScene* scene;
};

#endif
Run Code Online (Sandbox Code Playgroud)

TestApp.cpp:

#include "TestApp.h"

TestApp::TestApp()
: view(new QGraphicsView(this))
, scene(new QGraphicsScene(this))
{
    resize(220, 220);
    scene->setSceneRect(0, 0, 200, 200);

    const int BOARD_WIDTH …
Run Code Online (Sandbox Code Playgroud)

c++ scaling qt qgraphicsview qgraphicsscene

4
推荐指数
1
解决办法
3266
查看次数

QGraphicsScene::clear() 清除场景但不清除视图

我使用Configuration派生自的自定义类 ( )QGraphicsItem并将其对象添加到 a 中QGraphicsScene,然后将其显示在QGraphicsView. 平时的东西。我所做的就是画一棵树,分多个步骤,一步一步,每个节点都在我的自定义QGraphicsItem.

在此处输入图片说明

这里有一个截图。在简单的情况下,树恰好是连续的。

我首先绘制根节点。在用户输入字符串后触发的信号。

void MainWindow::drawRootSlot(ConfigTreeBuilder & builder)//this is a slot
{
    c_scene->clear();  //the clear cause headache. i'll expain

    Configuration* conf = new Configuration(builder.getNodesX(), builder.getNodesY(),builder.getNodesConfig());
//code
    c_scene->addItem(conf);
//code
}
Run Code Online (Sandbox Code Playgroud)

每个后续Configuration都在另一个插槽内绘制。

void MainWindow::configTreeSlot(ConfigTreeBuilder & builder)    //SLOT!!!
{
    while(builder.chooseNextNode()) {

        Configuration* conf = new Configuration(builder.getNodesX(), builder.getNodesY(), builder.getNodesConfig());

       //code, while loop    
            QGraphicsLineItem *edge = c_scene->addLine(QLineF(*(parentsPoint), conf->getLeftOrigin()));
            edge->setZValue(-1); //below the Configuration item


        c_scene->addItem(conf);
    }

}
Run Code Online (Sandbox Code Playgroud)

第一次完成时,一切正常。当我输入一个新字符串,重置树时,就会发生黑魔法。我期望它做的是:调用drawRootSlot(),删除整棵树( …

debugging qt qgraphicsview qgraphicsitem qgraphicsscene

4
推荐指数
1
解决办法
2万
查看次数

使用 Qt 在 QGraphicsScene 中画线

我画线有问题。当鼠标移动缓慢时效果很好,但是当鼠标移动得更快时,会出现一些间隙,我不知道为什么。这是代码:

if(QEvent::MouseButtonPress&&event->buttons()==Qt::LeftButton){
QPointF pt=mapToScene(event->pos());
        band->setGeometry(0,0,0,0);
         band->hide();
        band->update();
         this->scene()->addLine(pt.x(),pt.y(),pt.x(),pt.y(),QPen(color, size));
    qDebug()<<event->pos();
}
Run Code Online (Sandbox Code Playgroud)

这是一个屏幕截图:

在此处输入图片说明

左边画得慢,右边画得快。

qt mousepress qgraphicsscene

4
推荐指数
1
解决办法
4510
查看次数

我需要按实际(英寸/毫米)比例打印 QGraphicsScene

我正在尝试打印 .a 的内容QGraphicsScene。目标打印机可以是任何打印机 - 从普通打印机到自定义尺寸的特殊打印机。它必须以实际尺寸(英寸、毫米……)打印内容。
QGraphicsScene我使用的假设是 72 ppi。

我假设:
1)将场景渲染到打印机将根据打印机分辨率来完成,这样我就可以获得与屏幕上显示的类似的实际尺寸(英寸/毫米)的项目。
2)我可以将打印机的纸张尺寸设置为所需的画布尺寸(这是一个非常大的场景上的矩形),超出它的范围就不会打印
3)我可以设置边距,“实际画布”之外的内容将不得打印,包括页边空白处的内容。

到目前为止我的所有假设都是错误的:
1)对于不同的打印机,如果我建议接近其默认纸张尺寸的自定义尺寸(或者如果我没有设置纸张),则渲染似乎是最大适合(使用纵横比)尺寸);
如果我设置的纸张尺寸不接近(例如默认“LETTER”尺寸的打印机上的 4x4 英寸),它只会打印一张空白页。
2-3) 在有打印的情况下,打印机只是将画布拉伸至整页,绘图区域之外的所有项目仍会打印。
我尝试在画家上或通过在渲染时设置目标矩形来进行剪辑,结果是对场景的一小部分进行了非常奇怪的剪辑。

我尝试过 HP LaserJet、Adobe PDF 和一些特定尺寸(如 4x6 英寸)的自定义打印机。他们都根据我是否指定纵向或横向将场景缩放到最大尺寸,并完全忽略我的纸张尺寸要求或实际尺寸。

这是一个小示例程序,用于重现我正在尝试做的事情。
代码中的注释显示了我尝试过的一些选项。

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsEllipseItem>
#include <QPrinter>
#include <QPrintDialog>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QGraphicsScene* s = new QGraphicsScene();
    s->setSceneRect(-500, -500, 1500, 1500);
    QGraphicsView* view = new QGraphicsView();
    view->setScene(s);
    view->show();

    int canvasSize = 288;    // 4 in
    QRectF …
Run Code Online (Sandbox Code Playgroud)

printing qt qgraphicsscene qprinter

4
推荐指数
1
解决办法
2934
查看次数

PyQt:QGraphicsView中的鼠标事件

我想用 PyQt 用 Python 编写一个简单的程序。

我有一个 QGraphicsScene,我想执行以下操作:有 2 个使用两个单选按钮的选项:

  1. 用于生成点。这样,如果有人单击场景,就会出现一个椭圆。
  2. 用于选择点。这样,如果有人单击某个点,将返回所选点。

我对 PyQt 和 GUI 编程都有点陌生。我的主要问题是我不太明白 Qt 中鼠标事件是如何工作的。如果有人如此友善和耐心地向我解释鼠标事件的基础知识,并为我解决上述问题提供一些提示,我将非常感激。

我还附上一张图片,以形象化问题。 图形用户界面

我正在尝试做这个问题。为了放置小部件,我使用了 Qt Designer,然后创建了一个名为 SimpleWindow 的子类。

import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtGui import QPen, QBrush
from PyQt5.QtWidgets import QGraphicsScene
import points

class SimpleWindow(QtWidgets.QMainWindow, points.Ui_Dialog):

    def __init__(self, parent=None):
        super(SimpleWindow, self).__init__(parent)
        self.setupUi(self)

        self.graphicsView.scene = QGraphicsScene()
        self.graphicsView.setScene(self.graphicsView.scene)
        self.graphicsView.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)

        self.graphicsView.mousePressEvent = self.pixelSelect


    def pixelSelect(self, event):
        pen = QPen(QtCore.Qt.black)
        brush = QBrush(QtCore.Qt.black)

        x = event.x()
        y = event.y()

        if self.radioButton.isChecked():
            print(x, y) …
Run Code Online (Sandbox Code Playgroud)

python pyqt qgraphicsview qgraphicsscene pyqt5

4
推荐指数
1
解决办法
1万
查看次数

Pyside2如何获取鼠标位置?

我想在我的 pyside2 应用程序中获取鼠标位置。(不是 QCursor 提供的桌面鼠标位置),我尝试了两种方法。波纹管是我的代码。

import sys
from PySide2 import QtGui, QtWidgets, QtCore


class Palette(QtWidgets.QGraphicsScene):
    def __init__(self, parent=None):
        super().__init__(parent)


    def mousePressEvent(self, event):
        print(event.pos()) # always return (0,0)
        print(QtWidgets.QWidget.mapToGlobal(QtCore.QPoint(0, 0))) #makes parameter type error
        print(QtWidgets.QWidget.mapToGlobal(QtWidgets.QWidget))  # makes  parameter type error
        print(QtWidgets.QWidget.mapToGlobal(QtWidgets.QWidget.pos()))  # makes parameter type error

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        palette = Palette(self)
        view = QtWidgets.QGraphicsView(palette, self)
        view.resize(500, 500)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main_window = MainWindow()
    main_window.resize(500, 500)
    main_window.show()
    app.exec_()
Run Code Online (Sandbox Code Playgroud)

我很想知道如何让我的鼠标定位...

python qgraphicsview python-3.x qgraphicsscene pyside2

4
推荐指数
1
解决办法
2409
查看次数

如何在 QGraphicsScene 中正确放置小部件

我正在尝试实现一个小部件(一个临时工具箱),它将放置在场景的右侧。它应该看起来像这样:

问题

在移动和缩放视图时将其正确放置在那里并保持相同的大小和位置是一个问题。

小部件本身是一个 QComboBox。我尝试将其作为 QGraphicsWidget 放入场景中,将 ZValue 设置为较高的数字并将其设置为 QGraphicsLinearLayout。不幸的是,我无法将其与左侧对齐,而且我觉得我的做法是错误的。

这是一个草图:

from PySide2 import QtWidgets, QtCore, QtGui
import sys

def hex2QColor(color):
    r = int(color[0:2], 16)
    g = int(color[2:4], 16)
    b = int(color[4:6], 16)
    return QtGui.QColor(r, g, b)

class rotateGroupBox(QtWidgets.QGroupBox):
    """Create content to fill the widget"""
    def __init__(self, parent=None):
        super(rotateGroupBox, self).__init__(parent)

        self.setTitle("Rotation")

        self.l_rotate = QtWidgets.QSpinBox()
        self.l_rotate.setRange(0, 360)

        self.r_rotate = QtWidgets.QSpinBox()
        self.r_rotate.setRange(0, 360)

        self.l_label = QtWidgets.QLabel("Left: ")
        self.r_label = QtWidgets.QLabel("Right: ")

        layout = QtWidgets.QVBoxLayout()

        l1 = QtWidgets.QHBoxLayout()
        l1.setContentsMargins(0,0,0,0)
        l1.addWidget(self.l_label)
        l1.addWidget(self.l_rotate)

        l2 = QtWidgets.QHBoxLayout() …
Run Code Online (Sandbox Code Playgroud)

python qgraphicsview qgraphicsscene pyside2

4
推荐指数
1
解决办法
2002
查看次数