作为这个问题的结果,我想更多地了解Qt的QTransform::rotate功能.在文档中,它说:
QTransform&QTransform :: rotate(qreal angle,Qt :: Axis axis = Qt :: ZAxis)
围绕指定轴逆时针旋转坐标系,并返回对矩阵的引用.
请注意,如果将QTransform应用于窗口小部件坐标中定义的点,则旋转方向将为顺时针方向,因为y轴指向下方.
角度以度为单位指定.
从我之前的问题,我了解到QPolygonF顺时针旋转,我必须实际逆时针旋转90度,根据rotate功能:
QPolygonF original = QPolygonF() << QPoint(0, 1) << QPoint(4, 1) << QPoint(4, 2) << QPoint(0, 2);
QTransform transform = QTransform().translate(2, 2).rotate(90).translate(-2, -2);
QPolygonF rotated = transform.map(original);
qDebug() << rotated;
Run Code Online (Sandbox Code Playgroud)
输出:
QPolygonF(QPointF(3, 0) QPointF(3, 4) QPointF(2, 4) QPointF(2, 0) )
Run Code Online (Sandbox Code Playgroud)
例如,这个矩形:

要旋转到此处:

为什么是这样?为什么文档说我的调用QTransform::rotate实际上导致顺时针旋转,当我相信我不在"小部件坐标"时 - 这里没有涉及小部件.
我使用Qt 5.1.1在Windows上开发了一个项目,并在QML文件中使用了QtQuick 2.0导入.最近我发现我的应用程序需要OpenGL 2.0或更高版本,因此无法在具有OpenGL 1.0的系统上运行.我搜索并发现这是因为QtQuick 2.0导入.
该问题是:我不能修改导入从QtQuick 2.0至1.0 QtQuick因为我得到的错误:
QtQuick 1.0 module verison is not installed
Run Code Online (Sandbox Code Playgroud)
那我怎么才能安装QtQuick 1.0呢?我还安装了QtQuile 4.7附带的Qt 4.7,但是从Qt 5.1.1移植到Qt 4.7恰好是相当困难的工作.它并不那么简单,所以我想尽量保持简单,并在Qt 5.1.1上安装QtQuick 1.0.
注意:我在QML文件中没有做奇怪的事情; QML代码应该可以正常使用QtQuick 1.0.
我正在使用 Qt Quick Controls 2 并为上下文菜单编写以下代码:
Menu{
id: contextmenu
x: ( parent.width - contextmenu.width ) / 2
y: ( parent.height - contextmenu.height ) / 2
modal: true
property int selid
MenuItem {
text: "Compare"
visible: isexp
}
Divider{ visible: isexp }
MenuItem {
text: "Send..."
visible: isexp
}
Divider{ visible: isexp }
MenuItem {
text: "Edit..."
}
Divider{}
MenuItem {
text: "Delete"
}
}
Run Code Online (Sandbox Code Playgroud)
分隔线 - 这是我的组件。isexp是对象的属性。当isexp false 菜单显示错误。查看截图: https ://s31.postimg.org/c608kdtbv/qqq.png
如何更改菜单项的可见性并正确显示菜单。感谢您的建议。
我正在 Qt5.7.0 QtCreator 4.1 中编写移动应用程序,我在 QtQuick qml 文件中收到错误“无效的属性名称“样式”(M16)”并且表单不想显示某些内容。我在做什么错?
我必须先在项目中配置某些内容还是使用其他类型的文件?
我尝试在某些组件上使用此属性,但它仅适用于 Text 对象,我不知道为什么。
这是我的代码:
//register_form.qml
import QtQuick 2.0
import QtQuick.Controls 2.0
import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.1
Item {
width: 270
height: 480
anchors.fill: parent
ColumnLayout {
id: loginLayout
anchors.rightMargin: 15
anchors.bottomMargin: 92
anchors.leftMargin: 23
anchors.topMargin: 91
anchors.fill: parent
TextField {
TextFieldStyle {
id: phoneStyle
placeholderTextColor: "grey"
}
id: phoneField
placeholderText: "+7 XXX XXX XX XX"
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
}
Button {
style: //error occurs here
ButtonStyle {
}
id: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 QtQuickControls2 对话框:
Dialog {
id: dialog
x: parent.width/2-width/2
y: parent.height/2-height/2
width:300
height:200
title: "Warning"
modal: true
standardButtons: Dialog.Ok
visible: false
onAccepted: console.log("Ok clicked")
}
Button {
id: button
objectName: "doSomethingButton"
onClicked: {
if(problemFlag==true)
dialog.visible=true
}
}
Run Code Online (Sandbox Code Playgroud)
如果按钮被点击并且problemFlag是 ,它应该被触发true。我读到如果modal设置为true用户无法与程序的其余部分交互。但是,如果我单击对话框外的某处,它就会消失(无需单击“确定”)。
使用msvc2017编译以下代码时
void Foo::bar(A */*a*/)
Run Code Online (Sandbox Code Playgroud)
我收到这个警告:
foo.cpp:38: warning: C4138: '*/' found outside of comment
Run Code Online (Sandbox Code Playgroud)
我可以通过在星号后面添加一个空格来解决这个问题:
void Foo::bar(A * /*a*/)
Run Code Online (Sandbox Code Playgroud)
但是,我必须在很多地方执行此操作,如果我取消注释参数,由于额外的空间,我使用的编码样式将不会被遵循.
由于我没有用gcc或clang得到相同的警告,我想知道这是否是可以安全地禁用的特定于MSVC的怪癖.
我想知道在使用Qt时如何更新和渲染游戏对象.例如,对于一个典型的游戏,你会有一个事件循环,但Qt就是这样exec().使用Qt更新和渲染游戏对象的正确方法是什么?我如何做每个帧之间的时间来更新我的游戏对象?我是否为所有这些使用单独的线程?
我的问题非常类似于这个主题,除了我不想避免标准的Qt进程.
编辑:我为不完整的问题道歉.我相信tmpearce已经回答了我的问题,但这里有一个基本的例子,说明我试图做的事情以防其他人有同样的问题:
int main(int argv, char **args)
{
QApplication app(argv, args);
ApplicationWindow window;
window.show();
// How and where do I update my Game object?
return app.exec();
}
class Game
{
public:
void timeUpdate()
{
// Update game entities, etc. Should be called every frame.
}
void render()
{
// Renders game entities - where should I render to?
// Should be called 30 times a second, etc.
}
};
Run Code Online (Sandbox Code Playgroud)
干杯.
我有一个使用像素艺术的Qt Quick游戏.例如:
import QtQuick 2.2
import QtQuick.Controls 1.1
ApplicationWindow {
id: window
visible: true
width: 300
height: 300
title: qsTr("PixelArt")
Image {
source: "http://upload.wikimedia.org/wikipedia/commons/f/f0/Pixelart-tv-iso.png"
anchors.centerIn: parent
}
}
Run Code Online (Sandbox Code Playgroud)

我想缩放艺术,所以我增加了尺寸:
import QtQuick 2.2
import QtQuick.Controls 1.1
ApplicationWindow {
id: window
visible: true
width: 300
height: 300
title: qsTr("PixelArt")
Image {
source: "http://upload.wikimedia.org/wikipedia/commons/f/f0/Pixelart-tv-iso.png"
anchors.centerIn: parent
width: 256
height: 256
}
}
Run Code Online (Sandbox Code Playgroud)

图像变得模糊.如何在保持其"清晰度"的同时缩放图像,使其看起来像这样:

我有一个"画布",用户可以在上面绘制像素等.它运行良好,但我的缩放功能目前使用相同的原点,无论鼠标的位置如何.我想实现类似谷歌地图缩放行为的功能:
也就是说,缩放的原点应该始终是鼠标光标的位置.
我目前所拥有的并不完全正确......
我的尝试大多是在黑暗中刺伤,但我也试过使用这个答案的代码没有成功.
main.cpp:
#include <QGuiApplication>
#include <QtQuick>
class Canvas : public QQuickPaintedItem
{
Q_OBJECT
public:
Canvas() :
mTileWidth(25),
mTileHeight(25),
mTilesAcross(10),
mTilesDown(10),
mOffset(QPoint(400, 400)),
mZoomLevel(1)
{
}
void paint(QPainter *painter) override {
painter->translate(mOffset);
const int zoomedTileWidth = mTilesAcross * mZoomLevel;
const int zoomedTileHeight = mTilesDown * mZoomLevel;
const int zoomedMapWidth = qMin(mTilesAcross * zoomedTileWidth, qFloor(width()));
const int zoomedMapHeight = qMin(mTilesDown * zoomedTileHeight, qFloor(height()));
painter->fillRect(0, 0, zoomedMapWidth, zoomedMapHeight, QColor(Qt::gray));
for (int y = 0; y < …Run Code Online (Sandbox Code Playgroud) qt ×8
qml ×7
c++ ×4
qt-quick ×4
qtquick2 ×4
coordinates ×1
event-loop ×1
pixelate ×1
qt-creator ×1
rotation ×1
scaling ×1
visual-c++ ×1