小编MrK*_*ish的帖子

如何在使用QQmlApplicationEngine时从C++访问我的Window对象属性?

我一直在努力学习QtQuick用于GUI创建,但我一直很难理解如何从我的测试程序的C++部分与QML对象进行交互.

这是我简单的QML文件:

import QtQuick 2.2
import QtQuick.Window 2.1

Window {
    id: mainWindow
    visible: true
    width: 800
    height: 800
    color: "#FFFF0000"

    MouseArea {
        anchors.fill: parent
        onClicked: Qt.quit()
    }

    Rectangle {
        id: testRect
        width: 100
        height: 100
        anchors.centerIn: parent
        color: "#FF0000FF"
    }
}
Run Code Online (Sandbox Code Playgroud)

这是随附的基本C++文件(由QtCreator自动生成):

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道如何访问我的'Window'QML对象,因此,我无法改变它的任何属性或其子项的属性!QtQuick文档的这一部分显示了从C++代码中访问QML对象的两种方法,但它们似乎都不适用于这个'QQmlApplicationEngine'加载方案.我也看到人们使用'QApplicationViewer'和'QDeclaritiveView'之类的东西,但我似乎无法在官方文档中找到那些..

我对QtQuick感到非常沮丧; QML的"简单性"似乎在大量冲突的文档和C++与QML之间错综复杂的界面中丢失.无论如何我在使用QQmlApplicationEngine方法时访问我的QML对象?我尝试过使用'QuickView',但它似乎不适用于Window QML对象..?QQmlApplicationEngine仅对单个文件中的QML应用程序有用吗?到目前为止,我读过的每一篇文档和教程都显示了不同的东西......

任何帮助或澄清将不胜感激.理想情况下,我想知道如何通过我的C++代码访问和修改QML对象(如'mainWindow','testRect'和其他文件中的其他对象).

c++ user-interface qt qml qtquick2

39
推荐指数
1
解决办法
2万
查看次数

如何构建HTML以实现良好的代码重用和维护?

我在使用C++,C和Java等语言编写本机应用程序方面的背景有限,但现在我正在尝试进入Web开发.虽然大部分都非常简单和干净,但我在理解如何创建网站和webapps方面遇到了一些问题,这些网站和webapps在适用的情况下可以很好地重用现有代码.据我所知,当使用JavaScript,CSS和PHP之类的东西时,你可以简单地从其他文件中导入脚本以用于任何html文件,这非常有用.但是我很难弄清楚如何使用HTML来完成,是否可能?

例如,假设我有一个带有"标题栏"的单页网站和下面的一堆独特内容(例如,stackoverflow徽标,按钮和本页顶部的菜单).但现在,我想扩展我的网站并添加3个共享相似布局的新页面,并在顶部具有完全相同的"标题栏".实现此目的的一种方法可能是简单地复制包含该部分代码的内容并将其粘贴到page2.html,page3.html和page4.html中; 每个页面的唯一代码是独立的,它可以正常工作.我用这种方法遇到的问题是,如果不经过多页HTML就改变"标题栏"的内容会非常痛苦,并且设计/内容中创建奇怪的不一致的几率变得很高.我猜"stackoverflow.com/questions/ask"和"stackoverflow.com/tags"不包含页面顶部元素的重复,复制和粘贴代码,但我不确定如何实现这一点,因为我有限的HTML经验..

那么,是否有一些"包含"或"导入"HTML代码的方法是为了跨多个页面清理代码重用?这个功能是内置到HTML中还是我需要更深入地研究JavaScript和PHP之类的东西来创建结构良好的网站?我已经找到了答案,有几个人建议使用iframe,但几乎立即建议不要在现代网页设计中使用它们.什么可能是一个好方法?

html html5 code-reuse maintenance

16
推荐指数
3
解决办法
2万
查看次数

通过构造函数传递和存储const引用?

这可能是一个简单的问题,但我坚持下去.我试图通过它的构造函数将一个对象从ObjectA传递给ObjectB(它是ObjectA的一个成员).但是,我想传递一个const引用并无限期地存储该引用,而不是传递值.问题是我不知道该怎么做.

我可以用这样的指针来处理这个问题:

class ClassB
{
private:
    int *ptrInternalX;
public:
    ClassB( int *tempX );
}

ClassB::ClassB( int *tempX )
{
    ptrInternalX = tempX
}
Run Code Online (Sandbox Code Playgroud)

这样,创建一个对象并将指针传递给int,该指针存储在类中以供以后使用.

但是,当使用更大的对象时,指针让我担心内存泄漏和其他问题,所以我想尝试使用'常量引用'(const&)来做这样的事情.但是,这似乎不起作用......

class ClassB
{
private:
    int &internalX;
public:
    ClassB( const int &tempX );
}

ClassB::ClassB( const int &tempX )
{
    internalX = tempX
}
Run Code Online (Sandbox Code Playgroud)

我知道引用本质上是现有变量的"别名"(引用相同内存地址的不同名称),并且需要使用现有变量立即初始化它们.所以这会在我的程序中产生错误!

这甚至可能吗?或者是否有更好/更清晰的方式做这样的事情?我想使用常量引用的原因是只传递引用而不是大对象的速度,同时保持数据免受意外更改和内存泄漏......我确信有一种简单直接的方法这样做但我对const引用传递不是很熟悉.

c++ pointers reference constants

10
推荐指数
1
解决办法
2万
查看次数

在进行OOP状态机设计时如何避免单例?

我正在努力教自己编程.我开始的方式与我相信大多数人的开始方式相同; 制作小而凌乱的应用程序和游戏,以不那么简单的方式做简单的事情.最近,我一直试图通过编写一个使用OOP设计的更复杂的游戏来编写更好,更模块化的代码来迈出下一步!

我遇到的主要问题是我的主要StateManager(FSM)类的设计(在介绍/菜单/游戏/等屏幕状态之间切换).我看起来又高又低,我真的只看到了两种设计方法:

  • 使用switch/case语句+枚举来切换状态.

  • 创建一个单独的FSM类,用于处理向量/从向量中推送/弹出状态.

现在,我的问题是,switch case语句是非常重复和笨重的,它有点违背我使用这个项目来教自己OOP的目标.

我的第二个也是更大的问题是"单身人士"的建议.

正如我之前所说,我正在努力自学,在编程时我还有很多需要学习的东西,特别是在OOP和设计模式以及所有这些方面.我遇到了一个问题,对于我发现的每一个单身"单身都是邪恶的"线索和讨论,我发现很多教程和参考,其中人们在他们的代码中使用单例来制作'引擎'类和FSM.这是一个非常一致的混合信息.

我想我只是不明白为什么......即使你只想要/打算拥有一个类的单个对象,为什么使构造函数私有并创建一个单例是必要/有益的?我已经阅读了很多关于单身人士是如何坏,他们如何基本上是全球性的,他们如何妨碍多线程,以及有多少程序员认为他们过度使用或只是简单的糟糕设计......但我看到例子后面的例子人们使用它们,很少有反例显示替代方法.

只用常规课可以做同样的事吗?明确限制实例创建的目的是什么?我只听过关于单身人士的消极事情,但人们似乎经常使用它们......我完全错过了关于单身人士和OOP的事情吗?

单身人士的使用只是一种趋势,还是只是人们称单身人士为"邪恶"的趋势?我该怎么解决这个问题?开关/外壳FSM和单独FSM之间没有什么东西?有没有人能够以完全相同的方式设计他们的程序的状态系统,而不需要他们的任何课程单身人士?这会改变什么吗?[ confused ]

c++ oop singleton fsm

8
推荐指数
1
解决办法
1873
查看次数

如何正确构建OOP和多文件项目?

作为一名初学程序员,刚刚学习了OOP的基础知识,我遇到了很多关于我的练习程序的基本包含结构的问题.我一直在教自己使用各种书面和在线资源进行编程.但是,这是我的问题(好吧,其中一个......):

一方面,我理解抽象,封装和类之间的低度耦合的重要性,但另一方面,我一直在努力构建我的程序并以允许不同的方式设计我的类在不同的文件中的类来了解彼此.

当然,这是我的一个主要问题,导致草率,hackish代码只能按照我想要的方式工作,我将每个基本的主要OOP抛出窗口并开始用全局变量填充我的代码,向前声明一切到处都是,让班级成员公开.

简单地说:我的编程很乱...... C++是我的第一个编程语言,即使我尽力以面向对象的方式设计/编写,我最终会得到一个丑陋的文件,#包括几乎所有的东西每个文件,以及很少有效的程序和OOP意大利面条代码的奇怪组合!

我是一个自称编程的新手,我接受学习如何构建一个程序需要时间,但我几乎要结束了!我知道我的问题源于我对OOP 有点了解的事实.我知道我想编写处理单个任务的独立类.但与此同时,我不明白如何正确地提醒每个类的程序其他部分的存在.这有点像知道你应该吃什么类型的食物,但不知道如何使用叉...

简而言之,这是我的问题.并进一步跟进我提出的一些更具体的问题:

  • 在C++多文件项目中,将main()函数放在自己的类中是正常/需要的吗?或者将main()留在全局范围内是标准的事情吗?

  • 在之前的程序性程序中,我用C++编写,在main.cpp文件的顶部,在全局作用域中有一个常量变量或#defines并不罕见.例如,可能在程序开始时定义屏幕的尺寸或其他有用信息.OOP会发生什么?是否完全避免了这种做法?或者我是否在项目的每个其他标题中创建MAIN.H文件并将其包含在内?我不知道该怎么办......

  • 在编写我的第一个中等规模的练习OOP程序时,当我开始尝试编写StateMachine类时,我的工作开始戛然而止.我打算让StateMachine类包含程序将使用的所有可能的屏幕状态.但是,出现了一个问题,即我的StateMachine类似乎不知道我的其他一些State类,即使它们都是#included.我见过人们之前做过类的前进声明,是否有必要?我应该在整个地方垃圾邮件发送类的前向声明,还是代码味道?

  • 最后,#include和forward声明命令的顺序是否重要?

我知道这可能是一个超级基本的问题,但是在我从单文件程序c ++初学者程序到多文件OOP编程的过渡中,这给我带来了很大的困难.是否有一些一般的经验法则来构建你的程序,以便一切正常?我一直在使用包含警卫,所以有什么理由不能只在每个源文件中包含#include每个头文件?我应该在每个类的每个头文件中都有#included的common.h文件吗?

我非常感谢社区给予我的任何帮助/建议.我知道在我开始发展我的OOP技能之前,这是一个简单而重要的障碍.我一直试图深入了解保持课程彼此分离的重要性,以至于我不确定如何以一种允许他们真正互相交流的方式真正设置我的课程/文件!非常感谢你的帮助!

c++ oop abstraction interface header

7
推荐指数
1
解决办法
2986
查看次数

从服务器删除 Git LFS 存储?

我最近使用 Gitlab CE 设置了一个小型 Linux 服务器,以便测试 Git LFS 用于游戏开发。为了感受 Gitlab 和 LFS 工作流程,我在一个流行的游戏引擎中制作了一个测试项目,其中包含许多大型二进制资产。快速编写后,.gitignore我们.gitattributes能够将存储库推送到我们的服务器并将其克隆到另一台 PC,并适当处理我们的大型资产文件!从工作流程的角度来看,它肯定比我们的旧设置更好 - 使用 Git 处理代码,使用 SVN 处理资产。

然而,我们注意到的问题之一是清理我们的测试项目并从我们的服务器中删除不需要的 LFS 文件。看起来 Gitlab 将每个项目的所有 LFS 文件存储在一个存储目录中(在我们的例子中,我相信是这样/mnt/storage/git-lfs-objects)。最重要的是,LFS 存储目录中的所有文件都有短的十六进制名称,无法分辨文件是什么或它们属于哪个项目。即使从 gitlab 中删除我们的测试项目后,我们注意到 lfs 对象仍然存在!

那么,有没有办法从 Gitlab 服务器的存储目录中删除不需要的 LFS 对象/文件?如果我们的 lfs 对象存储在每个项目的子目录中,这似乎会非常简单和直观。如果 lfs 对象至少保留部分原始文件名,那就更好了!我们确实有兴趣在未来的游戏开发项目中使用 git-lfs 和 gitlab,但我不太喜欢将来自不同项目的数据混合到一个庞大目录中的想法,以及可能会导致我们的服务器出现大量“数据泄漏”的情况难以识别的文件。

那么,我在这里缺少 git-lfs 或 Gitlab CE 的某些方面吗?我无法想象没有办法从服务器中删除不需要的 lfs 对象,但我运气不佳!

linux git version-control gitlab git-lfs

5
推荐指数
0
解决办法
976
查看次数

为什么某些情况需要使用"按位"运算符而不是"逻辑"/"相等"运算符?

有一天,我试图使用SDL多媒体库编写一个小型C++编程,然后我遇到了这个小麻烦,我最终通过反复试验解决了这个问题.问题是,我理解我为解决问题所做的工作,但我并不了解问题的本质!

问题在于SDL中的键盘事件处理.处理单键按下以退出程序的代码是直截了当且简单的.[eventQueue是一个SDL_Event结构]

//checks for keypress events..
if ( eventQueue.type == SDL_KEYDOWN )
{ 
    //note: uses the boolean logical '==' equals operator..
    if ( eventQueue.key.keysym.sym == SDLK_ESCAPE )
    {
        running = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,只需按下ESCAPE键就可以结束主循环并导致程序清理和关闭......

但是...处理使用修饰键(shift/alt/ctrl)的按键所需的代码与'=='运算符无法正常工作.我花了很长时间才发现我需要使用按位AND运算符而不是相等(逻辑?)运算符.

//checks for keypress events..
if ( eventQueue.type == SDL_KEYDOWN )
{ 
    //note: requires the use of the bitwise AND operator..
    if (( eventQueue.key.keysym.mod & KMOD_ALT ) && (eventQueue.key.keysym.sym == SDLK_F4 ))
    {
        running = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的困惑来自这样一个事实:当使用'keysym.sym'成员时,逻辑运算符'=='工作正常,但是,当使用'keysym.mod'成员时,有必要使用'&'按位AND运算符.

现在,如果我不得不猜测,我会说它与'keysym.sym'只需要处理一个代表键盘上单个键的数字值这一事实有关,而'keysym.mod'有处理shift,ctrl和alt键的各种组合......?

总结一下我的问题: …

c++ boolean-logic sdl event-handling bitwise-operators

3
推荐指数
1
解决办法
512
查看次数

返回一个指针数组?

我是一名初学程序员,我在使用C++ OOP方面遇到了很多麻烦.具体来说,今晚我正在尝试编写一个简单的类,它接收事件并在多个图像之间切换,并指向存储在数组中的每个图像.在尝试创建一个返回指向数组本身的指针的"getter"函数时遇到了一个令人困惑的问题.

基本上,我试图做这样的事情:

class SlideShow
{
public:
    image *getSlideArray();
private:
    image *slideArray[10];
};
Run Code Online (Sandbox Code Playgroud)

所以,我想要一个存储指向每个图像的指针的数组.我还想要一个返回数组本身地址的函数.我在尝试定义getSlideArray()函数时遇到了一个问题...我只是不完全确定它为什么不能正常工作......

这是我最初尝试的,在我的课程'源文件中:

image *SlideShow::getSlideArray()
{
    return this->slideArray;
}
Run Code Online (Sandbox Code Playgroud)

在这种尝试中,编译器一直在使用'this'关键字引发问题,说我试图返回的不是之前指定的类型.然而,这是我迄今为止编写getter函数的方式,它通常在使用简单变量时起作用......我怀疑这里存在一些问题,因为'this'是一个指针,'slideArray'是一个指向一个数组的指针,该数组也包含指针......但是我很可怕,现在这种引用的程度超出了我的想象.我花了一段时间才收集对指针的基本理解,使用地址和操作符等引用.指针和指针数组的指针更令人困惑.

我还要提一下,我找到了一个解决方法,我的代码编译.(虽然我不能真正运行它来检查它是否在运行时工作..)我的工作涉及将定义/返回语句添加到类声明本身(在头文件中):

class SlideShow
{
public:
    image *getSlideArray() {return *slideArray;);
private:
    image *slideArray[10];
};
Run Code Online (Sandbox Code Playgroud)

现在.这编译正确......但是,这也让我感到困惑.我知道通常,当你返回一个数组(比如一个int数组)时,你将返回数组的第0个插槽的地址.但是如果我试图返回一个intArray [5],当它返回时,我会简单地写'intArray',对吗?基本上,我并不感到困惑,为什么我必须在'slideArray'之前添加*在这种情况下......

所以无论我尝试做哪种方式,都让我感到困惑.我知道这里有一些'技巧',它可能与返回指针指针或指针的指针有关,但我只是无法自己解决.我真的希望学习这门课程,这样我才能开始掌握编程,尤其是OOP ......

谁能帮助我更好地理解这一点?

c++ arrays oop pointers return

2
推荐指数
1
解决办法
9217
查看次数

导致这些链接器错误的原因是什么?(Visual C++ LNK2005)

我是一名新手程序员,仍在努力学习C++和OOP设计基础知识.我一直在努力自学的项目是一个C++游戏,它有多个类,文件,状态等.但是,我一直遇到文件组织的障碍,范围从简单地在哪里创建对象到编译 - 破坏链接器错误.

以下是我收到的一些错误的示例:

1>SMGA.obj : error LNK2005: "class Engine smgaEngine" (?smgaEngine@@3VEngine@@A) already defined in Engine.obj
1>SplashScreenState.obj : error LNK2005: "class Engine smgaEngine" (?smgaEngine@@3VEngine@@A) already defined in Engine.obj
1>StateManager.obj : error LNK2005: "class StateManager gameStateManager" (?gameStateManager@@3VStateManager@@A) already defined in Engine.obj
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
Run Code Online (Sandbox Code Playgroud)

我在网上看过,我看到很多〜类似的问题涉及不好的包括警卫或包含.cpp文件而不是.h文件.但是我的代码中没有这样做,所以我很茫然.

现在,我猜这个错误告诉我,我正在尝试两次创建Engine类的smgaEngine对象(以及StateManager类的gameStateManager对象),但我不确定为什么......

关于这两个对象(smgaEngine和gameStateManager)的突出之处在于我在类声明后立即在相应的类'.h文件中声明它们.这可能是问题吗? - 他们仍然在包含警卫范围内,我不太确定将其放在我的代码中的其他地方......这种草率编码是否会导致链接器错误?

这是可疑课程之一......

#ifndef ENGINE_H
#define ENGINE_H

#include <SDL.h>
#include "Timer.h"

class Engine
{
private:
    static const int screenWidth = 480;
    static const …
Run Code Online (Sandbox Code Playgroud)

c++ oop linker class

0
推荐指数
1
解决办法
251
查看次数