为什么使用QGraphicsView::scale, 当scale的参数小于1时我的QGraphicsScene上的item就全部消失了?

superwavelet superwavelet 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
当scale的参数大于1时可以正确放大,但是scale的参数小于1时我的QGraphicsScene上的item就全部消失了?
求指教

部分代码如下:


#include "iitems.h"
#include <QtGui>
#include "Link.h"
#include "Node.h"
#include "propertiesdialog.h"
#include <QWidget>

extern float Xmax,Ymax;
extern int VisZoom;
extern float iData[6376][3];
extern float xx,yy;

iItems::iItems()
{
QSplitter *MainSplitter = new QSplitter(Qt::Horizontal);
QSplitter * WidgetRight = new QSplitter(Qt::Vertical);
QWidget *SubWidget1 = new QWidget;
QWidget *SubWidget2 = new QWidget;

//QWidget *area= new QWidget;
view = new QGraphicsView;

spinBox1 = new QSpinBox;
QSlider *slider1 = new QSlider(Qt::Horizontal);
spinBox1->setRange(1, 9);
spinBox1->setValue(1);
SpinBoxValue1=spinBox1->value();
VisZoom=10;
slider1->setRange(1, 9);

QObject::connect(spinBox1, SIGNAL(valueChanged(int)),
slider1, SLOT(setValue(int)));
QObject::connect(slider1, SIGNAL(valueChanged(int)),
spinBox1, SLOT(setValue(int)));
QObject::connect(spinBox1, SIGNAL(valueChanged(int)),
this, SLOT(setVisZoom()));

QHBoxLayout *layout1 = new QHBoxLayout;
layout1->addWidget(spinBox1);
layout1->addWidget(slider1);
SubWidget1->setLayout(layout1);

QSpinBox *spinBox2 = new QSpinBox;
QSlider *slider2 = new QSlider(Qt::Horizontal);
spinBox2->setRange(0, 130);
spinBox2->setValue(25);
slider2->setRange(0, 130);
QObject::connect(spinBox2, SIGNAL(valueChanged(int)),
slider2, SLOT(setValue(int)));
QObject::connect(slider2, SIGNAL(valueChanged(int)),
spinBox2, SLOT(setValue(int)));

QHBoxLayout *layout2 = new QHBoxLayout;
layout2->addWidget(spinBox2);
layout2->addWidget(slider2);
SubWidget2->setLayout(layout2);

WidgetRight->addWidget(SubWidget1);
WidgetRight->addWidget(SubWidget2);

MainSplitter->addWidget(view);
MainSplitter->addWidget(WidgetRight);

view->setDragMode(QGraphicsView::RubberBandDrag);// 选择多个节点方式:1.按ctrl;2.设置橡皮筋方式
view->setRenderHints(QPainter::Antialiasing
| QPainter::TextAntialiasing);
view->setContextMenuPolicy(Qt::ActionsContextMenu);// 右键菜单
setCentralWidget(MainSplitter);

scene = new QGraphicsScene(0, 0, Xmax*VisZoom, Ymax*VisZoom);// 创建场景,起始点为(0,0), 宽600,高500
view->setScene(scene);// 显示场景
view->setStyleSheet("background-color:gray");

minZ = 0;
maxZ = 0;
seqNumber = 0;
createActions();
createMenus();
createToolBars();
connect(scene, SIGNAL(selectionChanged()),
this, SLOT(updateActions()));
setWindowTitle(tr("Diagram"));
updateActions();
}


// 增加一个节点
void iItems::addNode1()
{
Node *node = new Node;
node->setText(tr("Node %1").arg(seqNumber + 1));
setupNode1(node);
}

void iItems::setupNode1(Node *node)
{
node->setPos(QPoint(80 + (100 * (seqNumber % 5)),

80 + (50 * ((seqNumber / 5) % 7))));
scene->addItem(node);
++seqNumber;
scene->clearSelection();
node->setSelected(true);
bringToFront();
}

void iItems::bringToFront()
{
++maxZ;
setZValue(maxZ);
}
void iItems::sendToBack()
{
--minZ;
setZValue(minZ);
}
void iItems::setZValue(int z)
{
Node *node = selectedNode();
if (node)
node->setZValue(z);
}

Node *iItems::selectedNode() const
{
QList<QGraphicsItem *> items = scene->selectedItems();
if (items.count() == 1) {
return dynamic_cast<Node *>(items.first());
} else {
return 0;
}
}

void iItems::addLink()
{
NodePair nodes = selectedNodePair();
if (nodes == NodePair())
return;
Link *link = new Link(nodes.first, nodes.second);
scene->addItem(link);
}
...全文

相关推荐

评论 3
收藏 已收藏
分享
返回顶部
superwavelet
C++ 语言 65,214 成员 250,514 内容