快速问题,为什么:
void roiwindow::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsScene::mouseMoveEvent(event);
qDebug() << event->button();
}
Run Code Online (Sandbox Code Playgroud)
当我在图形中移动光标的同时按住鼠标左键时,返回0而不是1.反正有没有让它返回1所以我可以告诉用户何时在图形切片上拖动鼠标.谢谢.
我试图将图像添加到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) 在我正在开发的基于 Qt 的应用程序中,我使用 QGraphicsView 在 2D 网格中显示传感器数据。在侧面,我想显示一个图例/调色板,将网格中的颜色与值相关联。
用户可以缩放和平移传感器数据视图,但可以理解的是,调色板应该在视图中固定。因此,将调色板/图例放置在传感器视图场景中需要一些额外的注意:应用逆用户变换。
不过,我宁愿将调色板/图例实现为一种(非交互式)覆盖层,并具有自己的转换。这有可能吗?
我正在搞乱QGraphicsView
并QGraphicsScene
创建一个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) 我使用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()
,删除整棵树( …
我画线有问题。当鼠标移动缓慢时效果很好,但是当鼠标移动得更快时,会出现一些间隙,我不知道为什么。这是代码:
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)
这是一个屏幕截图:
左边画得慢,右边画得快。
我正在尝试打印 .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) 我想用 PyQt 用 Python 编写一个简单的程序。
我有一个 QGraphicsScene,我想执行以下操作:有 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) 我想在我的 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)
我很想知道如何让我的鼠标定位...
我正在尝试实现一个小部件(一个临时工具箱),它将放置在场景的右侧。它应该看起来像这样:
在移动和缩放视图时将其正确放置在那里并保持相同的大小和位置是一个问题。
小部件本身是一个 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) qgraphicsscene ×10
qt ×6
python ×4
pyside2 ×2
c++ ×1
debugging ×1
mouseevent ×1
mousepress ×1
overlay ×1
printing ×1
pyqt ×1
pyqt5 ×1
pyside ×1
python-3.x ×1
qprinter ×1
qt4 ×1
scaling ×1
transform ×1