我正在搞乱QGraphicsView并QGraphicsScene创建一个Tic Tac Toe克隆.我在QGraphicsLineItem场景中添加一些s并覆盖resizeEvent包含视图的Widget 的方法,这样当调整窗口大小时,视图及其内容将被适当缩放.这工作正常,除了我第一次运行程序:

一旦我按任意数量调整窗口大小,场景就会正确缩放:

这是代码:
main.cpp中:
#include <QtGui>
#include "TestApp.h"
int main(int argv, char **args)
{
QApplication app(argv, args);
TestApp window;
window.show();
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
TestApp.h:
#ifndef TEST_APP_H
#define TEST_APP_H
#include <QtGui>
class TestApp : public QMainWindow
{
Q_OBJECT
public:
TestApp();
protected:
void resizeEvent(QResizeEvent* event);
QGraphicsView* view;
QGraphicsScene* scene;
};
#endif
Run Code Online (Sandbox Code Playgroud)
TestApp.cpp:
#include "TestApp.h"
TestApp::TestApp()
: view(new QGraphicsView(this))
, scene(new QGraphicsScene(this))
{
resize(220, 220);
scene->setSceneRect(0, 0, 200, 200);
const int BOARD_WIDTH …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) 我想使用ListView为我的游戏创建一个库存用户界面,通过在级别中拖放项目,可以从库存中删除这些项目.如果物品未正确掉落(仍在库存内),则应将其放回拖动前的位置.
我有以下代码,但我不知道如何实现我所追求的,即使在查看拖放示例之后.
import QtQuick 2.3
Rectangle {
id: root
width: 400
height: 400
ListView {
id: listView
width: parent.width / 2
height: parent.height
model: ListModel {
Component.onCompleted: {
for (var i = 0; i < 10; ++i) {
append({value: i});
}
}
}
delegate: Item {
id: delegateItem
width: listView.width
height: 50
Rectangle {
id: dragRect
width: listView.width
height: 50
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
color: "salmon"
border.color: Qt.darker(color)
Text {
anchors.centerIn: parent
text: modelData
}
MouseArea {
id: …Run Code Online (Sandbox Code Playgroud) 我正在编写一个C++库,并且记得我需要导出每个类.
以下代码:
class MyClass
Run Code Online (Sandbox Code Playgroud)
应成为:
class MY_EXPORT MyClass
Run Code Online (Sandbox Code Playgroud)
我有几个类需要这个改变 - 有没有办法使用Qt Creator做到这一点?
我想在我的 Qt 应用程序中过滤 USB 设备插入/删除事件。因此,我需要使用installNativeEventFilter()将本机偶数过滤器(源自QAbstractNativeEventFilter)安装到我的应用程序中。问题是我需要从我的事件过滤器发出一些信号,并将它们连接到我的应用程序中的插槽。所以,如果我可以从QApplicationand 中继承QAbstractNativeEventFilter,那么信号和槽都在同一个类中,连接起来更方便。但是下面的代码安全吗?
class QApp : public QApplication, public QAbstractNativeEventFilter
{
virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE;
signals:
void deviceChanged();
...
};
QApp a(argc, argv);
a.installNativeEventFilter( &a );
Run Code Online (Sandbox Code Playgroud) 如果下一个元素的宽度超过指定布局的宽度,是否有 QML 布局或某些配置会自动将 QML 项目包装到下一行?
当我使用QML GridLayout时,项目只是离开窗口边缘并被剪切:
GridLayout {
id: header_focused_container;
width: parent.width;
anchors.margins: 20;
Text {
text: "header_focused_container.width=" +
header_focused_container.width +
" and my width is =" + width
}
Rectangle { height:20; width:250; color: "red" }
Rectangle { height:20; width:250; color: "blue" }
Rectangle { height:20; width:250; color: "green" }
}
Run Code Online (Sandbox Code Playgroud)
![网格布局工作[1]](https://i.stack.imgur.com/fJ4EN.png)
当我查看 Qt 标记为“可扩展性”的文档页面时,我发现正在进行非常手动的缩放。基本上,他们建议我需要计算所需的列。
是否有某种布局类型或配置可以自动换行项目?
我正在尝试对项目向量进行排序。正如代码注释中提到的,顺序应该是:
行动分较多(mAp)的参与者先行。当平局时,mDisposition与战斗发起者 ( )性格相同 ( ) 的参与者mBattleInitiator先行。
以下代码(简化示例)在 macOS 上崩溃,可能是由于我的排序实现不正确:
#include <QtCore>
class AiComponent
{
public:
enum Disposition {
Friendly,
Hostile
};
AiComponent(Disposition disposition) : mDisposition(disposition) {}
~AiComponent() { qDebug() << "Destroying AiComponent"; }
Disposition mDisposition;
};
class BattleManager
{
public:
BattleManager() : mBattleInitiator(AiComponent::Hostile) {}
class Turn {
public:
Turn() : mAp(1) {}
Turn(QSharedPointer<AiComponent> aiComponent) :
mAiComponent(aiComponent),
mAp(1)
{
}
Turn(const Turn &rhs) :
mAiComponent(rhs.mAiComponent),
mAp(1)
{
}
QSharedPointer<AiComponent> mAiComponent;
int mAp;
};
void …Run Code Online (Sandbox Code Playgroud) 我正在将QScriptEngine代码迁移到QJSEngine,并且遇到了一个问题,我在评估脚本后无法调用函数:
#include <QCoreApplication>
#include <QtQml>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QJSEngine engine;
QJSValue evaluationResult = engine.evaluate("function foo() { return \"foo\"; }");
if (evaluationResult.isError()) {
qWarning() << evaluationResult.toString();
return 1;
}
if (!evaluationResult.hasProperty("foo")) {
qWarning() << "Script has no \"foo\" function";
return 1;
}
if (!evaluationResult.property("foo").isCallable()) {
qWarning() << "\"foo\" property of script is not callable";
return 1;
}
QJSValue callResult = evaluationResult.property("foo").call();
if (callResult.isError()) {
qWarning() << "Error calling \"foo\" function:" << …Run Code Online (Sandbox Code Playgroud) 有没有办法在QML中访问C++对象的成员变量?在main.cpp我揭露的目的是QML.如何controller.x在QML中访问?
Controller ctrl;
QQuickView view;
QQmlContext* ctx = view.rootContext();
ctx->setContextProperty("controller", &ctrl);
Run Code Online (Sandbox Code Playgroud)
在控制器中:
public:
int x;
Run Code Online (Sandbox Code Playgroud) 我有一个标签,但它应该只和表格一样长。如果标签较长,则应从新行开始。我怎么能意识到这一点?我正在使用 QtQuick Controls 2.0
我当前的标签代码:
Label {
id: lblMsg
width: ApplicationWindow.width - 10 // not working
text: "ajksdlldjklasdasdasdasdasdasdasdasdasdasdasdasdasdasdasd"
x: 20
y: 20
}
Run Code Online (Sandbox Code Playgroud) 我在C ++中有一个QQuickItem,它在QML应用程序中实例化。如果我的QQuickItem的width属性改变,我想在c ++端触发一个自定义函数。
在QML中,我将执行onWidthChanged:{我的代码}。我该如何在c ++方面做到这一点?
我正在使用momentics IDE(原生SDK)开发BlackBerry 10移动应用程序.
当我尝试构建项目并在设备上测试它(BlackBerry Dev alpha B)时,它会无缘无故崩溃并出现以下错误:
"启用了Qml调试.只能在安全的环境中使用它!"
我真的不知道它来自哪里,我在网上搜索了很多没有结果.拜托,有没有人对此有任何想法?