This commit is contained in:
2026-06-05 22:26:39 -05:00
parent de199fd8a1
commit 6fba54f9c0
6 changed files with 154 additions and 11 deletions

View File

@@ -5,14 +5,44 @@ project(sonobulus LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
# add_library(sonobulus_core STATIC find_package(Qt6 REQUIRED COMPONENTS
# # empty Core
# ) Quick
)
add_executable(sonobulus qt_standard_project_setup()
add_library(sonobulus_core STATIC
src/TimerComponent.cpp
)
target_link_libraries(sonobulus_core PRIVATE
Qt6::Core
Qt6::Quick
)
qt_add_executable(sonobulus
src/main.cpp src/main.cpp
) )
# target_link_libraries(sonobulus qt_add_qml_module(sonobulus
# sonobulus_core URI sonobulus
# ) VERSION 1.0
QML_FILES src/Main.qml
)
target_link_libraries(sonobulus PRIVATE
sonobulus_core
Qt6::Core
Qt6::Quick
)
install(TARGETS sonobulus)
if (WIN32)
add_custom_command(
TARGET sonobulus POST_BUILD
COMMAND powershell -c "${Qt6_DIR}/../../../bin/windeployqt6.exe --qmldir . $<TARGET_FILE:sonobulus>"
COMMENT "windeployqt..."
VERBATIM
)
endif()

View File

@@ -37,7 +37,8 @@ to produce somewhat well-sounding instruments and music performance.
Prerequisites: Prerequisites:
CMake: https://cmake.org/download/ \ CMake: https://cmake.org/download/ \
QtWidgets: https://www.qt.io/development/download-qt-installer-oss Qt6::QML: https://www.qt.io/development/download-qt-installer-oss \
Note: you must export the Qt install location to your environment. E.g. add the following to a powershell profile: `$env:Qt6_DIR = "C:\Qt\6.10.1\msvc2022_64"`
Compiler that supports C++20. Builds have been tested with GCC12 & MSVC17 Compiler that supports C++20. Builds have been tested with GCC12 & MSVC17

33
src/Main.qml Normal file
View File

@@ -0,0 +1,33 @@
import QtQuick
import QtQuick.Controls
import AppDemo
ApplicationWindow {
visible: true
width: 600
height: 400
title: "sonobulus"
TimerComponent {
id: timerComponent
}
Column {
anchors.centerIn: parent
spacing: 20
Label {
text: timerComponent.seconds + " s"
font.pixelSize: 32
horizontalAlignment: Text.AlignHCenter
}
Button {
text: "Reset"
onClicked: timerComponent.reset()
}
}
}

24
src/TimerComponent.cpp Normal file
View File

@@ -0,0 +1,24 @@
#include "TimerComponent.hpp"
TimerComponent::TimerComponent(QObject* parent) : QObject(parent) {
// QTimer attach callback
connect(&timer_, &QTimer::timeout, this, &TimerComponent::increment);
timer_.start(1000);
}
void TimerComponent::reset() {
seconds_ = 0;
emit secondsChanged();
}
void TimerComponent::increment() {
seconds_++;
emit secondsChanged();
}

33
src/TimerComponent.hpp Normal file
View File

@@ -0,0 +1,33 @@
#pragma once
#include <QObject>
#include <QTimer>
class TimerComponent : public QObject {
Q_OBJECT
Q_PROPERTY(int seconds READ seconds NOTIFY secondsChanged)
public:
explicit TimerComponent(QObject* parent = nullptr);
int seconds() const { return seconds_; }
public slots:
void reset();
signals:
void secondsChanged();
private:
void increment();
int seconds_ = 0;
QTimer timer_;
};

View File

@@ -1,9 +1,31 @@
#include <iostream> #include <iostream>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "TimerComponent.hpp"
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
std::cout << "hi mom !" << std::endl; // create application
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
return 0; // attach backend gui components
qmlRegisterType<TimerComponent>("AppDemo", 1, 0, "TimerComponent");
// load qml
//engine.loadFromModule("sonobulus", "Main");
//engine.load(QUrl("qrc:/Main.qml"));
engine.load(QUrl::fromLocalFile("src/Main.qml")); // ugh
if(engine.rootObjects().isEmpty()) {
std::cout << "engine is empty" << std::endl;
return -1;
}
// execute app
return app.exec();
} }