gpt4 book ai didi

c++ - 放大 QGraphicsView 时如何保持 QPen 像素宽度相同

转载 作者:可可西里 更新时间:2023-11-01 18:02:20 24 4
gpt4 key购买 nike

我编写了一个快速而讨厌的程序来帮助我可视化我正在从事的项目的一个方面。虽然我从 4.1.1 开始就一直在使用 Qt,但我从来没有真正需要使用 QGraphics* 模块。

当我开始使用该程序时,我正在使用一台运行 Windows XP 和 Qt4.7.0 以及 Visual Studio 2008 的旧计算机。我现在刚刚将文件复制到运行 Windows 8 的主计算机上。我我决定试一试 Qt5,所以我安装了带有 Qt5.0.2 的 QtCreator。

当我编译与我在 Qt4.7.0/XP 机器上创建的完全相同的代码时,我得到了截然不同的结果。

这是我在 Qt4.7.0 编译上看到的:

Zoomed-out view from Qt4.7.0/XP compilation

这是我在 Qt5.0.2 编译中看到的: Zoomed-out view from Qt5.0.2/Win8x64 compilation

很明显,每个矩形边框的绘制都有不同的行为。另外,如果我使用鼠标滚轮放大,矩形边框宽度在 Qt5 编译中变大,但在 Qt4.7 编译中保持不变(大约 1 个像素宽)。

如何更改代码以使 Qt5 中的行为与 Qt4.7 中的行为相同?

完整代码如下:

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QWheelEvent>

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QVariant>
#include <QSqlError>
#include <QMessageBox>

class ItemData : public QSqlRecord{
public:
ItemData(QSqlRecord const &rec) : QSqlRecord(rec) {}

qreal left() const { return value(0).toDouble(); }
qreal top() const { return value(1).toDouble(); }
qreal width() const { return value(2).toDouble() - left(); }
qreal height() const { return value(3).toDouble() - top(); }
QRectF rect() const { return QRectF(left(), top(), width(), height()); }
QString barcode() const { return value(4).toString(); }
QString msaName() const { return value(5).toString(); }
QString msaDescription() const { return value(6).toString(); }
QString hsaName() const { return value(7).toString(); }
QString hsaDescription() const { return value(8).toString(); }
};

class DSAItem : public QGraphicsRectItem{
public:
DSAItem(ItemData const &data, QGraphicsItem *parent = 0)
:QGraphicsRectItem(parent) {
setFlags(QGraphicsItem::ItemIsSelectable);
setRect(data.rect());
QString tip = "<p><b>%1</b></p><p><b>MLSA</b><br/>%2<br/>%3</p><p><b>HLSA</b><br/>%4<br/>%5</p>";
setToolTip(tip.arg(data.barcode(), data.msaName(), data.msaDescription(), data.hsaName(), data.hsaDescription()));
if(data.barcode() == "1010100101" || data.barcode() == "1010100114"){
colour = QColor(Qt::red);
} else {
colour = QColor(Qt::yellow);
}
colour.setAlphaF(.5);
setBrush(QBrush(colour));
}

QVariant itemChange(GraphicsItemChange change, QVariant const &value){
if (change == QGraphicsItem::ItemSelectedHasChanged){
QColor c = value.toBool() ? QColor(Qt::green) : colour;
c.setAlphaF(.5);
setBrush(QBrush(c));
update(rect());

}
return QGraphicsRectItem::itemChange(change, value);
}

private:
QColor colour;
};

class View : public QGraphicsView {
public:
View(QWidget *parent = 0): QGraphicsView(parent){
populateScene();
setScene(&scene);
rotate(-90);
scale(1.0, -1.0);
setDragMode(ScrollHandDrag);
}

protected:
void wheelEvent(QWheelEvent *e){
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);

double scaleFactor = 1.15;
if (e->delta() > 0){
scale(scaleFactor, scaleFactor);
} else {
scale(1 / scaleFactor, 1 / scaleFactor);
}
}

private:
void populateScene(){
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
//db credentials here

QString errorMessage;
bool ok = db.open();
if (ok){
QSqlQuery query(db);
QString sql = //query string here

if (query.exec(sql)){
while(query.next()){
scene.addItem(new DSAItem(query.record()));
}
} else {
errorMessage = query.lastError().text();
}
} else {
errorMessage = db.lastError().text();
}

if (!errorMessage.isEmpty()){
QMessageBox::critical(0, "Database Error", errorMessage);
}
}

private:
QGraphicsScene scene;
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
View view;
view.show();

return a.exec();
}

最佳答案

这有点晚了,但可能会有帮助。

建议的解决方案工作正常,但限制了笔的宽度。另一种方法是使用指令

p.setCosmetic(true);

根据 Qt 引用 (http://qt-project.org/doc/qt-5/qpen.html#isCosmetic)

Cosmetic pens are used to draw strokes that have a constant width regardless of any transformations applied to the QPainter they are used with.

它还解释了为什么将宽度设置为零有效:

A zero width pen is cosmetic by default; pens with a non-zero width are non-cosmetic.

关于c++ - 放大 QGraphicsView 时如何保持 QPen 像素宽度相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17075623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com