Call c++ function in Widget blueprint - c++

I create widget, inherited from C++ class below.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "Widget_Manager.generated.h"
UCLASS()
class CRY_API UWidget_Manager : public UUserWidget
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadWrite, Category ="test")
int32 x;
UFUNCTION(BlueprintCallable, Category = "test")
int32 increase_x(int32 i);
};
I want to output the value of x in value1, then increase it, and output it to value2.
My problem is that the blueprints do not see the function increase_x().
Not in elements list, not in function search.
Also i tried property CallInEditor.
How I can call this function in widget?

Please make sure that your not using Hot Reload (the Compile C++ button in the Editor).
If you make changes to your C++ code, especially Headers, always close the Editor and recompile it from Visual Studio. Hot Reload cannot resolve changes to Header files, which means things like Functions and new Properties will not be available in Blueprint if your using Hot Reload until you do a recompile from Visual Studio.
Also its best to leave Context Sensitivity on.

Related

Open a Window in JUCE and put a PluginEditor into it

The tl;dr How do I open a window in Juce to display a plugin Editor?
I am following the Juce AudioProcessGraph tutorial at https://docs.juce.com/master/tutorial_audio_processor_graph.html which shows how to dynamically load AudioProcessor objects.
I would like to open their GUIs as they're loaded. This could be in separate windows or in the window that's got the slots for the graph.
I've tried creating a AudioProcessorEditor, but I'm at a loss on how to tell it to open.
Edit to add: What I've tried so far:
I've downloaded the code from the Tutorial: Cascading plug-in effects from https://docs.juce.com/master/tutorial_audio_processor_graph.html
I've also used ProJucer to create a new plugin. I've put the new plugin's files into the tutorial's files and used ProJucer to add PluginEditor.cpp and PluginEditor.h to the tutorial project.
I've changed the PluginEditor.h so the private class member audioProcessor is of type ProcessorBase&. And made ProcessorBase& the expected type for the data passed to the constructor.
In the tutorial code, in the header file, I've changed the ProcessorBase class so that the methods hasEditor() and createEditor() are just declarations and then modified main.cpp as follows:
#include "PluginEditor.h"
#include <iostream>
//=======================================================
juce::AudioProcessorEditor* ProcessorBase::createEditor()
{
std::cout "asking for an editor\n";
return new NewProjectAudioProcessorEditor (*this);
}
bool ProcessorBase::hasEditor() const
{ return true; }
In the included header, in the TutorialProcessor class, in the updateGraph() method, under the if (hasChanged), I've added slot->getProcessor()->createEditorIfNeeded (); on line 387-ish.
I can tell from my cout that createEditor() is being called and know that the constructor for the editor is running, but no window opens.
How do I tell it to open a window?
The code compiles and runs, but no window opens.

vscode shortcut or easier method to add a functions to class

I went up and down of the vscode documentation to find a way to automatically create functions inside the class, every time I am adding a method to a class I need to copy the definition and scroll to the bottom of the page to implement the method.
Clion had a great set of tools for this
https://www.jetbrains.com/help/resharper/Code_Generation_in_CPP.html#equality
I wonder if there is any easy way that I can use to add a function to a class without scroll up and down the file
class HelloWorld
{
private:
public:
int IWantToDefineAMethod(); //<- need to scroll here and write this
};
int HelloWorld::IWantToDefineAMethod() //<-- then need to scroll to here and write this
{
}
// and need to scroll here and there couple of time just to add a single function!
https://marketplace.visualstudio.com/items?itemName=amiralizadeh9480.cpp-helper
I'm not the creator and just found it.
A side note is that it creates implementation for prototype but it doesn't check if it's duplicated which is described in the Known ISSUE section.
You need to set CppHelper.SourcePattern to let plugin knows where should it search for source file.
Example:
"CppHelper.SourcePattern": [
"{FILE}.cpp",
"{FILE}.c",
"{FILE}.inl",
"/src/{FILE}.cpp"
]
Where {FILE} is your active header file name.

wxWidgets - Splitting project into multiple files

I am very new to C++, I'm making this music application using wxWidgets, this is my first project in C++. As of now, I have 4 files, app.hpp and app.cpp which has a class that inherits from wxApp that launches the application, and frame.hpp and frame.cpp which holds the base frame and panel, and all the widgets, and their appropriate functions. I want to move all the functions to a separate file, but I get some errors like there is this function in frame.cpp
void Frame::ClearPlaylist(wxCommandEvent& event)
{
mediaCtrl->Stop();
playlistBox->Clear();
}
I tried moving it in another file called command.cpp and created a new class called command and prefixed all functions to Command:: .... and somethings like the playlistBox here, is a widget which I want in frame.cpp only, as it is a widget, so I did #include frame.hpp and prefixed it with Frame::playlistBox, but that gave a error saying invalid use of non static data member. So do I have to make everything in frame.hpp a static object? Or if anyone has a better solution for organizing a project like this please do share.

AActor *UactorComponent::GetOwner const - pointer to incomplete class type is not allowed

I'm new to UE4 development and I've followed Udemy's Unreal Engine Development course. I have created a new Component on an Actor, named PositionReporter with header PositionReporter.h
#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "PositionReporter.generated.h"
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class BUILDINGESCAPE_API UPositionReporter : public UActorComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UPositionReporter();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
};
and code in PositionReporter.cpp being
#include "PositionReporter.h"
// Sets default values for this component's properties
UPositionReporter::UPositionReporter()
{
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
// off to improve performance if you don't need them.
PrimaryComponentTick.bCanEverTick = true;
// ...
}
// Called when the game starts
void UPositionReporter::BeginPlay()
{
Super::BeginPlay();
FString t = GetOwner()->GetActorLabel();
UE_LOG(LogTemp, Warning, TEXT("Position Reporter reporting for duty on %s"), *t);
}
// Called every frame
void UPositionReporter::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
// ...
}
As you can see, I am now trying to call the GetName function on the Pointer to the AActor retrieved through GetObject().
However, as soon as I type "GetObject()->" no autocomplete pops up (as it does in the video) and when I add "GetName()" manually, I get the compiler error "pointer to incomplete class type is not allowed".
What am doing wrong? Am I missing an import or so? I already compared my code to Ben's git repo but can't find any differences. I am on unreal editor 4.16.0!
I noticed another strange thing: When I compile everything from Unreal Engine Editor, it compiles and runs fine. But when I compile it with VS 2017 I get the error, and I also dont get the Autocomplete, which is a real bummer. What am I missing?
Including Engine.h on PositionReporter.h fixes the issue.
#pragma once
#include "Engine.h" // <- This
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "PositionReporter.generated.h"
You'll need to give Intellisense some time... As a matter of fact I closed and reopened the solution for it to stop showing the non existing errors and give autocomplete functionality.
NOTE: As is mentioned in other posts, this solution is good to get intellisense autocompleting but isn't the best as it will include a ton of stuff and greatly increase compilation times.
Including the specific .h file would be better, but you need to know what .h to include, and probably you don't know it.
Best solution I found is ditching Intellisense and use Resharper for code autocompletion, it works fast, autocompletes correctly and you don't need to include any extra file.
I would like to point out that including "Engine.h" is going against the IWYU rationale from Unreal 4.15 onwards, because Engine.h is huge and slows down compile time. See the Unreal Documentation for more information on the matter. So although it solves the problem, and there is nothing particularly 'wrong' with doing it - it may not be the best idea.
Another option which is more in line with IWYU would be to include Actor.h in PositionReport.cpp since GetOwner is in the AActor class.
#include "PositionReport.h"
#include "GameFramework/Actor.h" //This is the change in PositionReport.cpp

C++ -> Visual Studio 2013 -> Windows Form -> Objects accessed through methods

Hello once again I am asking some experts for help. This time it is not about Linux commands but Visual Studio 2013 Windows Form in C++.
As always, details :
I have project with 2 forms, that's not really important.
Important things are :
I have 6 files : Windows.h, Windows.cpp, Game.h, Game.cpp, Test.h,Test.cpp
Including : Windows.cpp includes Windows.h, Windows.h includes Game.h, Game.h includes Test.h, Test.cpp includes Test.h as well.
Windows.h and Game.h are form declarations. This is where I need work to be done.
Windows. cpp is used as main, it executes whole project and do stuff.
Windows.h is Form for Menu, it just connects to Game.h Form and becomes hidden when Game appears.
Game.h is Form with game. I need to create and operate on objects in methods included in Forms connected to Buttons.
Example : Click on one button creates one object class Test with variable int number = 1 and click one other button changes this variable to 2.
I can't access same object through methods, all I can do is create two same objects and operate on them but they are different beings declared in other method. Is there any solution to construct object which can be accessed through every Form's method ?
Test.h
#pragma once
ref class Test
{
public:
int nr;
char *test;
Test();
Test(int n, char *t)
{
nr = n;
test = t;
}
};
Test.cpp
#include "Test.h"
Test::Test()
{
}
I declared objects in class Game as variables what gave me access to those objects in Game's method.