c++ - 在 QGraphicsView 中绘制班次
问题描述
当我在QGraphicsView对象中绘制时,我有一个奇怪的转变,
应该在左上角绘制带有内部红色方块的黑色方块。
.ui 文件:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>600</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Wator</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>580</width>
<height>536</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QGraphicsView" name="graphicsView"/>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
最后,我从中绘制的 MainWindow 中的代码:
#include "Mainwindow.hpp"
#include "ui_mainwindow.h"
#include "Environment.hpp"
#include <iostream>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene();
ui->graphicsView->setScene(scene);
scene->setBackgroundBrush(QColor(0, 0, 255));
grid_pen = QPen(Qt::black);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(drawEnvironment()));
timer->start(1000);
tick = 0;
initializeEnvironment();
QRect rcontent = ui->graphicsView->contentsRect();
ui->graphicsView->setSceneRect(0, 0, rcontent.width(), rcontent.height());
ui->graphicsView->setFixedWidth(50 * environment->getWidth());
ui->graphicsView->setFixedHeight(50 * environment->getHeight());
ui->graphicsView->setInteractive(false);
drawEnvironment();
}
void MainWindow::initializeEnvironment(){
this->environment = new Environment(10, 10);
std::vector<Agent*> agents;
for(uint32_t i = 0; i < 20; i++){
agents.push_back(new Agent());
}
this->environment->placeAgents(agents);
}
void MainWindow::drawEnvironment(){
scene->clear();
scene->addRect(0, 0, ui->graphicsView->width(), ui->graphicsView->height(), grid_pen, ocean_brush);
uint16_t cell_width = 50;
uint16_t cell_height = 50;
std::vector<Agent*> agents = environment->getAgents();
for(uint16_t i = 0; i < agents.size(); i++){
uint16_t x = agents[i]->getX();
uint16_t y = agents[i]->getY();
QBrush agent_brush(agents[i]->getColor());
scene->addRect(x * cell_width, y * cell_height,cell_width, cell_height, grid_pen, agent_brush);
std::cout << "(" << x << ";" << y << ")" << std::endl;
}
tick++;
}
MainWindow::~MainWindow()
{
delete timer;
delete environment;
delete scene;
delete ui;
}
我验证了我的 Agents 的坐标,它们确实在 0 到 10 之间,所以正方形应该画在 [0; 500]像素。什么可能导致这样的问题?
解决方案
如果您希望左上角为 (0, 0),则必须将 QGraphicsView 的对齐方式设置为Qt::AlignLeft | Qt::AlignTop
:
ui->graphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop);
推荐阅读
- c++ - Windows 服务不创建故障转储
- python - Pandas - fillna 与特定类别的平均值
- c++ - 在编写新代码时,作为错误不会妨碍的推荐的警告集是什么?
- javascript - 为什么我的带有 viewBox 和十六进制编码颜色的 SVG 图标在用作 javascript Image() 的“.src”时无法呈现
- node.js - 在 NodeJS 中使用 Tabulator 和 ExpressJS
- android - android admob 广告未显示(取决于密钥库文件???)
- flutter - 如何更改卡片内的文字或图像
- python - 使用情节动画
- netsuite - 如何移动从用户事件脚本创建的子列表字段
- javascript - 捕获 [...slug] 中的所有 URL,并且只为 Next.js 中的有效地址创建静态道具