- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,如果我想使用 QGraphicsView
在游戏中显示玩家的库存,我如何强制执行基于网格的 View ,其中拖放项目始终会导致它们与网格?
最佳答案
您可以在QGraphicsScene
子类中处理适当的鼠标事件:
#include <QApplication>
#include <QGraphicsItem>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsView>
#include <QMainWindow>
#include <math.h>
class GridScene : public QGraphicsScene
{
public:
GridScene() :
mCellSize(25, 25)
{
}
protected:
// Efficiently draws a grid in the background.
// For more information: http://www.qtcentre.org/threads/5609-Drawing-grids-efficiently-in-QGraphicsScene?p=28905#post28905
void drawBackground(QPainter *painter, const QRectF &rect)
{
qreal left = int(rect.left()) - (int(rect.left()) % mCellSize.width());
qreal top = int(rect.top()) - (int(rect.top()) % mCellSize.height());
QVarLengthArray<QLineF, 100> lines;
for (qreal x = left; x < rect.right(); x += mCellSize.width())
lines.append(QLineF(x, rect.top(), x, rect.bottom()));
for (qreal y = top; y < rect.bottom(); y += mCellSize.height())
lines.append(QLineF(rect.left(), y, rect.right(), y));
painter->drawLines(lines.data(), lines.size());
}
void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
mDragged = qgraphicsitem_cast<QGraphicsItem*>(itemAt(mouseEvent->scenePos(), QTransform()));
if (mDragged) {
mDragOffset = mouseEvent->scenePos() - mDragged->pos();
} else
QGraphicsScene::mousePressEvent(mouseEvent);
}
void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if (mDragged) {
// Ensure that the item's offset from the mouse cursor stays the same.
mDragged->setPos(mouseEvent->scenePos() - mDragOffset);
} else
QGraphicsScene::mouseMoveEvent(mouseEvent);
}
void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if (mDragged) {
int x = floor(mouseEvent->scenePos().x() / mCellSize.width()) * mCellSize.width();
int y = floor(mouseEvent->scenePos().y() / mCellSize.height()) * mCellSize.height();
mDragged->setPos(x, y);
mDragged = 0;
} else
QGraphicsScene::mouseReleaseEvent(mouseEvent);
}
private:
// The size of the cells in the grid.
const QSize mCellSize;
// The item being dragged.
QGraphicsItem *mDragged;
// The distance from the top left of the item to the mouse position.
QPointF mDragOffset;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow w;
w.resize(400, 400);
w.show();
QGraphicsView view(&w);
view.setScene(new GridScene());
view.resize(w.size());
view.setSceneRect(0, 0, view.size().width(), view.size().height());
view.show();
view.scene()->addRect(0, 0, 25, 25)->setBrush(QBrush(Qt::blue));
return a.exec();
}
#include "main.moc"
关于qt - 拖放时将 QGraphics 项目与网格对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054117/
我的窗口中有一个主小部件,其中包含很多小部件。如何在该小部件中插入 QGraphics View 和 QGraphicsScene?我还没有找到直接插入的方法,所以我尝试使用包装器,在本例中是盒子布局
例如,如果我想使用 QGraphicsView 在游戏中显示玩家的库存,我如何强制执行基于网格的 View ,其中拖放项目始终会导致它们与网格? 最佳答案 您可以在QGraphicsScene子类中处
[1/2] 背景 您好! Qt 为我们提供了创建高度自定义图形项目的方法。我们需要做的就是继承自 QGraphicsItem 并覆盖纯虚拟的 boundingRect() 函数。此外,我们可以选择性地
我画多条线 line = scene->addLine(x1, y1, x2, x2, Pen); 现在我想在线条的中间添加一个标签(例如椭圆或三角形。椭圆可能是简单的解决方案) 我的想法是为 Y (
我想使用 sqlalchemy 使 QGraphicsItem 持久化。轻松地将 Base 类与 PySide 类组合会产生有关元类的错误。元类主题是 Python 的魔力,当不需要时我不想深入研究它
我正在使用 Qt 的图形 View 框架可视化图形。它看起来像这样: 现在,我希望顶点的大小(我将其绘制为小的实心圆)相对于 View 的缩放保持不变。目前,我通过不将顶点作为场景中的项目来实现这一点
我目前有一个与 QGraphicsGridLayout 一起使用的 QGraphicsScene。我正在尝试在此网格布局上对齐 QWidgets(QLabel 和自定义图形 QWidget),然后将其
我遇到了一个非常令人沮丧的问题,试图删除我的应用程序中的 qgraphicsitems。我有一个菜单 Controller ,负责将按钮添加到布局并将它们添加到场景中。这些按钮都与自定义信号和槽相连。
一些背景 - 假设您有 QGraphicsScene,并且只有一个 View ,它与场景成 1-1 比例。 你有一个 QRect A,它代表场景的外部 View ,具有预定义的像素大小。 你有一个 Q
我是一名优秀的程序员,十分优秀!