728x90
반응형
728x90
반응형
반응형

Qt에서 Lambda를 활용한 Signal-Slot 연결 가이드


Qt에서 lambda는 주로 시그널과 슬롯을 연결할 때 유용하게 사용됩니다. QObject::connect와 함께 lambda를 사용하면 간단한 작업을 처리하기 위해 임시 함수를 정의할 수 있습니다. 아래는 lambda를 사용하는 다양한 예제와 주의사항입니다.


기본 예제: 버튼 클릭 이벤트 처리

cpp

#include <QApplication>
#include <QPushButton>
#include <QMessageBox>

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

    QPushButton button("Click Me");

    // Lambda를 사용하여 슬롯 연결
    QObject::connect(&button, &QPushButton::clicked, [&]() {
        QMessageBox::information(nullptr, "Lambda Example", "Button clicked!");
    });

    button.show();
    return app.exec();
}

매개변수 전달

lambda를 사용하면 외부 변수를 캡처하거나 함수 내부에서 값을 처리할 수 있습니다.

cpp

#include <QApplication>
#include <QPushButton>
#include <QString>

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

    QPushButton button("Click Me");
    QString message = "Hello from Lambda!";

    QObject::connect(&button, &QPushButton::clicked, [&]() {
        QMessageBox::information(nullptr, "Message", message);
    });

    button.show();
    return app.exec();
}

복잡한 예제: 시그널 변환 및 동적 처리

lambda를 활용하여 시그널의 데이터를 처리하거나 조건에 따라 동적으로 행동을 변경할 수 있습니다.

cpp

#include <QApplication>
#include <QSlider>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>

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

    QWidget window;
    QVBoxLayout layout(&window);

    QSlider slider(Qt::Horizontal);
    QLabel label("Value: 0");

    layout.addWidget(&slider);
    layout.addWidget(&label);

    QObject::connect(&slider, &QSlider::valueChanged, [&](int value) {
        label.setText(QString("Value: %1").arg(value));
    });

    window.show();
    return app.exec();
}

주의사항

  1. 캡처 리스트 관리

    • 외부 변수를 참조로 캡처([&])하거나 값으로 캡처([=])하는 방식을 선택해야 합니다.
    • 참조로 캡처하면 변수의 생존 주기를 관리해야 합니다.
  2. Signal-Slot 연결 해제

    • lambda로 연결한 슬롯은 자동으로 해제되지 않습니다. 필요하면 명시적으로 disconnect를 호출해야 합니다.
  3. 멀티스레드 환경

    • lambda를 사용하는 경우, 스레드 간 안전성을 항상 염두에 두어야 합니다.

Qt에서 lambda를 활용하면 코드의 간결성가독성을 높일 수 있습니다. 위의 예제들을 참고하여 프로젝트에서 효과적으로 사용해 보세요!

728x90
반응형
반응형

QHotkey : 데스크톱 Qt 애플리케이션을 위한 글로벌 단축키/핫키

Desktop Qt-Applications를 위한 글로벌 단축키shortcut/핫키hotkey 입니다.

QHotkey는 핫키/글로벌 단축키를 만드는 데 사용할 수 있는 클래스로, 애플리케이션 상태와 무관하게 어디에서나 작동하는 단축키입니다.

즉, 애플리케이션이 활성화, 비활성화, 최소화 또는 전혀 표시되지 않더라도 단축키를 받을 수 있습니다.

특징

  • Windows, Mac 및 X11에서 작동합니다.
  • 사용이 간편하고 QKeySequence를 사용하여 간편한 단축키 입력이 가능합니다.
  • 거의 모든 일반 키 지원(OS 및 키보드 레이아웃에 따라 다름)
  • 키/수정자 조합을 직접 입력할 수 있습니다.
  • 동일한 단축키에 대해 여러 QHotkey 인스턴스 지원(최적화 포함)
  • 스레드 안전 - 모든 스레드에서 사용 가능(스레드 안전 섹션 참조)
  • 필요한 경우 기본 키코드 및 수정자 사용 허용

참고: 현재 Wayland는 지원되지 않습니다. Wayland로 글로벌 단축키를 등록할 수 없기 때문입니다. 자세한 내용이나 Wayland에서 단축키를 작동시키는 방법에 대한 아이디어는 Issue #14 를 참조하세요.

빌딩

QHotkey는 Qt6와 Qt5를 모두 지원합니다. Qt6를 사용하는 경우 버전 6.2.0 이상이 필요합니다. CMake 빌드 시스템을 사용하여 빌드할 수 있습니다.

CMake

CMake QT_DEFAULT_MAJOR_VERSION 변수는 빌드에 사용되는 Qt의 주요 버전을 제어하며 기본값은 5입니다. 예를 들어, Qt6로 빌드하려면 CMake 명령줄 옵션 -DQT_DEFAULT_MAJOR_VERSION=6을 사용합니다. 테스트 애플리케이션 QHotkeyTest를 빌드하려면 -DQHOTKEY_EXAMPLES=ON을 지정합니다.

CMake 예제:

$ cd QHotkey
$ cmake -B build -S . -DQT_DEFAULT_MAJOR_VERSION=6
$ cmake --build build
# cmake --install build

설치

패키지는 qpm 패키지, de.skycoder42.qhotkey 로 제공됩니다. qpmx(선호)를 통해 또는 qpm을 통해 직접 설치할 수 있습니다.

qpmx를 통해

qpmx 는 추가 기능이 있는 qpm(및 기타 도구)의 프런트엔드이며, 패키지를 설치하는 데 선호되는 방법입니다. 사용하려면:

  1. qpmx 설치 (GitHub - 설치 참조)
  2. qpm 설치 (GitHub - 설치 참조, Windows의 경우 아래 참조)
  3. 프로젝트 루트 디렉토리에서 qpmx install de.skycoder42.qhotkey를 실행합니다.

qpm을 통해

  1. qpm 설치 (GitHub - 설치 참조, Windows의 경우 아래 참조)
  2. 프로젝트 루트 디렉토리에서 qpm install de.skycoder42.qhotkey를 실행합니다.
  3. .pro 파일에 include(vendor/vendor.pri)를 추가하여 프로젝트에 qpm을 포함합니다.

qpm에 대해 자세히 알아보려면 GitHub - 앱 개발자를 위한 사용 설명서 를 확인하세요.

Windows 사용자에게 중요: QPM 버전 0.10.0(웹사이트에서 다운로드할 수 있는 버전)은 현재 Windows에서 작동하지 않습니다! 마스터에서 이미 수정되었지만 아직 출시되지 않았습니다. 새 버전이 출시될 때까지 여기에서 최신 개발 빌드를 다운로드할 수 있습니다.

사용법

일반적인 사용법은 특정 단축키에 대한 QHotkey 인스턴스를 생성하고 이를 등록한 다음 단축키를 눌렀을 때 방출되는 신호에 간단히 연결하는 것입니다.

다음 예제는 Ctrl+Alt+Q(Mac에서는 ++Q) 키 조합을 누를 때까지 백그라운드에서 창 없이 실행되는 간단한 애플리케이션을 보여줍니다. 이렇게 하면 애플리케이션이 종료됩니다. 디버그 출력은 핫키가 성공적으로 등록되었는지, 그리고 눌렸는지 알려줍니다.

#include <QHotkey>
#include <QApplication>
#include <QDebug>

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

	QHotkey hotkey(QKeySequence("Ctrl+Alt+Q"), true, &app); //The hotkey will be automatically registered
	qDebug() << "Is segistered:" << hotkey.isRegistered();

	QObject::connect(&hotkey, &QHotkey::activated, qApp, [&](){
		qDebug() << "Hotkey Activated - the application will quit now";
		qApp->quit();
	});

	return app.exec();
}

참고: 이 작업을 수행하려면 .pri include가 필요합니다.

테스트

./HotkeyTest에서 예제를 실행하면 QHotkey 클래스를 테스트할 수 있습니다. 4개의 섹션이 있습니다.

  • Playground: 여기에 몇 가지 시퀀스를 입력하고 다양한 키 조합으로 시도해 볼 수 있습니다.
  • Testings: 선택된 단축키 목록입니다. 활성화하고 어떤 단축키가 당신에게 맞는지 시도해보세요 (힌트: OS와 키보드 레이아웃에 따라 몇 가지는 작동하지 않을 가능성이 매우 높습니다).
  • Threading: 플레이그라운드의 핫키 2개를 스레드로 분리하려면 체크박스를 활성화합니다. 아무런 차이 없이 작동해야 합니다.
  • Native Shortcut: 네이티브 단축키를 직접 사용해 볼 수 있습니다.

로깅

기본적으로 QHotkey는 무언가 잘못되면(예: 번역할 수 없는 키) 경고 메시지를 출력합니다. QHotkey의 모든 메시지는 QLoggingCategory "QHotkey"로 그룹화됩니다. 로깅을 비활성화하려면 코드 어딘가에 다음 함수를 호출합니다.

QLoggingCategory::setFilterRules(QStringLiteral("QHotkey.warning=false"));

이렇게 하면 QHotkey의 모든 경고가 꺼집니다(지금은 경고만 사용하므로 이것으로 충분합니다). 로깅 범주로 할 수 있는 모든 작업에 대한 자세한 내용은 Qt 문서를 확인하세요.

스레드 안전성

QHotkey 클래스 자체는 재진입 가능합니다. 즉, 모든 스레드에서 필요한 만큼 많은 인스턴스를 만들 수 있습니다. 이를 통해 모든 스레드에서 QHotkey를 사용할 수 있습니다. 하지만 인스턴스가 속한 스레드와 다른 스레드에서는 QHotkey 인스턴스를 사용해서는 안 됩니다! 내부적으로 시스템은 핫키 이벤트를 처리하고 이를 QHotkey 인스턴스에 분배하는 싱글톤 인스턴스를 사용합니다. 이 내부 클래스는 완전히 스레드 안전합니다.

그러나 이 싱글톤 인스턴스는 메인 스레드에서만 실행됩니다. (한 가지 이유는 일부 OS 함수가 스레드 안전하지 않기 때문입니다.) 스레드 핫키를 가능하게 하기 위해 중요한 함수(핫키 등록/등록 해제 및 키 변환)도 모두 메인 스레드에서 실행됩니다. 다른 스레드의 QHotkey 인스턴스는 Qt::BlockingQueuedConnection과 함께 QMetaObject::invokeMethod를 사용합니다.

여러분에게 이는 다음을 의미합니다. 메인 스레드가 아닌 다른 스레드의 QHotkey 인스턴스는 핫키를 등록/등록 해제/변환하는 데 약간 더 오래 걸릴 수 있습니다. 메인 스레드가 이를 대신 수행할 때까지 기다려야 하기 때문입니다. 중요: 그러나 이 기능에는 한 가지 추가 제한이 있습니다. 메인 스레드가 아닌 다른 스레드의 QHotkey 인스턴스는 메인 이벤트 루프가 끝나기 전에 등록 해제되거나 파괴되어야 합니다. 그렇지 않으면 핫키 파괴 시 애플리케이션이 중단됩니다. 이 제한은 메인 스레드의 인스턴스에는 적용되지 않습니다. 또한 루프가 시작되기 전에 단축키를 변경하거나 등록/등록 해제하는 경우에도 실제로 시작될 때까지 동일한 일이 발생합니다.

문서

문서는 릴리스 버전과 github 페이지 에서 사용할 수 있습니다.

문서는 doxygen 을 사용하여 작성되었습니다. 여기에는 HTML 문서와 Qt-Help 파일이 포함되어 있으며, 이를 QtCreator(QtAssistant)에 포함시켜 F1-Help를 표시할 수 있습니다(자세한 내용은 외부 문서 추가를 참조하세요).

기술적

요구 사항

  • 명시적 지원은 최신 Qt LTS에만 제공되지만 이전 버전에서도 작동할 수 있습니다.
  • 최소한 QtGui-Module(QGuiApplication). 콘솔 기반 애플리케이션의 단축키는 지원되지 않습니다(운영 체제에서). 그러나 보이는 창 없이 GUI 애플리케이션을 만들 수 있습니다.
  • C++11

알려진 제한 사항

  • 단일 키/수정자 조합만 가능합니다. QKeySequence를 사용하는 경우 시퀀스의 첫 번째 키+수정자만 사용됩니다.
  • Qt::Key는 일반 숫자와 숫자패드 숫자 사이에 차이를 두지 않습니다. 그러나 대부분의 키보드는 이것을 요구합니다. 따라서 네이티브 단축키를 사용하지 않는 한 숫자패드에 대한 단축키를 등록할 수 없습니다.
  • 모든 키를 지원하지는 않지만, 일반적인 키는 대부분 지원합니다. 플랫폼 간에 차이가 있으며 키보드 레이아웃에 따라 달라집니다. 예를 들어 "Delete"는 Windows와 Mac에서는 작동하지만 X11에서는 작동하지 않습니다(적어도 제 테스트 머신에서는 그렇습니다). 가능한 한 OS 함수를 사용하려고 했지만, Qt::Key 값을 네이티브 키로 변환해야 하기 때문에 몇 가지 제한이 있습니다. 필요한 키를 사용할 수 있으므로 네이티브 단축키를 사용해 보세요.
  • 등록된 키는 QHotkey에서 "취득"됩니다. 즉, 핫키가 애플리케이션에서 사용된 후에는 활성 애플리케이션으로 전송되지 않습니다. 이는 운영 체제에서 이런 방식으로 수행되며 변경할 수 없습니다.
  • X11에서 QHotkey: Failed to register hotkey. Error: BadAccess (attempt to access private resource denied) 오류가 발생하는 경우 X11에 개인용 핫키를 등록하려고 한다는 의미입니다. 이러한 키는 일반 API를 사용하여 등록할 수 없습니다.
728x90
반응형
반응형

Recurse : 미들웨어 디자인을 갖춘 Qt 기반 마이크로 웹 프레임워크

리커즈(Recurse)는 두 세계의 모든 최고의 기능을 활용하는 Qt 라이브러리를 사용하여 최신 C++(14)로 작성된 최신 웹 마이크로 프레임워크가 될 것으로 예상됩니다.

우리는 깔끔하고 이해하기 쉬운 코드를 작성하는 데 중점을 두고, 기여를 장려하기 위해 템플릿 사용을 피합니다.

리커즈는 코어에 미들웨어가 번들로 제공되지 않는 소형을 목표로 합니다.

이를 통해 차세대 웹 애플리케이션과 API를 작성하는 데 매우 견고할 수 있을 것입니다.

Node.js, koa 및 Express 마이크로 프레임워크에서 영감을 받았습니다.

예제

#include "recurse.hpp"

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

    // logger
    app.use([](auto &ctx, auto next)
    {
        qDebug() << ctx.request.ip;
        next();
    });

    // hello world
    app.use([](auto &ctx)
    {
        ctx.response.send("Hello world");
    });

    app.listen(3000);
};

설치

이것은 헤더 전용 라이브러리입니다.

사용하려면 프로젝트 내에 recurse.hpp를 포함하기만 하면 됩니다.

자세한 내용은 예시를 참조하세요.

참고 recurse.hpp가 다음에 종속적이므로, context.hpp, request.hpp, response.hpp도 필요합니다.

미들웨어

핵심에는 미들웨어가 포함되어 있지 않습니다.

예를 들어 라우팅의 경우 라우터 를 사용할 수 있습니다.

#include "router.hpp"

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

    Module::Router router;

    router.GET("/hello/:user", [](auto &ctx, auto /* next */)
    {
        ctx.response.send("Hello World " + ctx.request.params["user"]);
    });

    app.listen();
}

404 - Not Found

기본적으로 미들웨어가 응답하지 않으면 RecurseNot Found 메시지와 404 HTTP 오류 코드로 응답합니다.

자신의 응답을 만들려면 목록 에 새 미들웨어를 추가하기만 하면 됩니다.

// if any middleware before this responds this won't get called
app.use([](auto &ctx)
{
    ctx.response.status(404).send("Custom Not Found");
});

전체 예를 보려면 404 예제 를 참조하세요.

첫 번째 미들웨어로도 사용할 수 있습니다(이미 기록 등을 수행하는 첫 번째 미들웨어가 있는 경우)

app.use([](auto &ctx, auto next, auto prev)
{
    next([&ctx, prev]
    {
        // this is last code to be called before sending response to client
        if(ctx.response.status() == 404)
            ctx.response.body("Custom Not Found");

        prev();
    });
});

스타일링

코드를 작성할 때는 제공된 .clang-format 파일을 사용하세요.

vim에서 사용할 수 있는 좋은 vim-clang-format 플러그인이 있습니다.

수동으로 호출할 수도 있습니다

clang-format -i source.hpp

# to format all files
find . -name "*.hpp" -or -name "*.cpp" | xargs clang-format -i

그리고 단축키 명령도 사용할 수 있습니다

clang-format -i -style="{BasedOnStyle: WebKit, PointerAlignment: Right, Standard: Cpp11, TabWidth: 4, UseTab: Never, BreakBeforeBraces: Allman, AllowShortFunctionsOnASingleLine: false, ContinuationIndentWidth: 0, MaxEmptyLinesToKeep: 1, NamespaceIndentation: All, AccessModifierOffset: 0}" source.hpp
728x90
반응형
반응형

QtNodes : Qt 노드 편집기. 데이터 흐름 프로그래밍 프레임워크

소개

QtNodes는 다양한 애플리케이션을 위한 노드 에디터를 개발하는 것을 목표로 하는 범용 Qt 기반 라이브러리로 고안되었습니다.

이 라이브러리는 간단한 그래프 시각화 및 편집에 사용하거나 데이터플로우 패러다임을 사용하기 위해 추가로 확장할 수 있습니다.

라이브러리는 Model-View 접근 방식을 사용하여 작성됩니다.

전체 그래프 구조는 AbstractGraphModel에서 파생된 클래스로 정의됩니다.

노드 및 연결을 만들거나 추가할 수 있습니다.

기본 데이터 구조는 임의의 유형 또는 표현일 수 있습니다.

AbstractGraphModel의 인스턴스는 특수 QGraphicsSceneQGraphicsView 개체에 연결할 수도 있고 연결할 수도 없습니다. 즉, 소위 "headless" modus operandi 가 가능합니다.

문서화

QtNodes에 대한 문서를 읽어보세요.

[!Warning] 버전 3.0에서 많은 클래스가 변경되었습니다. 2.x.x를 기반으로 하는 대규모 프로젝트가 있는 경우, 새 코드를 확인하기 전에 먼저 설명서를 읽고 예제를 확인하세요.

데이터 흐름 패러다임

확장 모델 클래스인 DataFlowGraphModel을 사용하면 노드로 표시되는 '처리 알고리즘'을 등록할 수 있으며, 노드를 통해 데이터를 전파하기 위한 Qt의 신호와 슬롯 세트가 장착되어 있습니다.

노드의 알고리즘은 새로운 입력 데이터가 도착하면 트리거됩니다. 계산된 결과는 출력 연결로 전파됩니다. 각 새로운 연결은 사용 가능한 데이터를 가져와 전파합니다. 소스 노드의 각 변경 사항은 전체 그래프를 업데이트하는 모든 연결을 통해 즉시 전파됩니다.

지원 환경

플랫폼

  • 리눅스 (x64, gcc, Qt 5.15.2)
  • OSX (Apple Clang, Qt 5.15.2)
  • 윈도우 (MSVC, Qt 5.15.2)
  • 윈도우 (MSVC, Qt 6.3.0)

종속성

  • Qt >5.15
  • CMake 3.8
  • Catch2

현재 상태 (v3)

  • 모델 기반 그래프
  • 헤드리스 모드 AbstractGraphModel의 파생물을 생성, 채우기, 수정할 수 있습니다. 실제 Flow Scene에 추가하지 않고도 라이브러리는 이제 다음과 같이 설계되었습니다. 일반 용도의 그래프 시각화 및 수정 도구, 없음 데이터 전파에만 특화되어 있습니다.
  • 그래프 모델 코드 위에 구축된 자동 데이터 전파 라이브러리는 순수 그래프 시각화 목적과 다음 두 가지 목적으로 사용될 수 있습니다. 원래는 데이터 전파를 구현했습니다.
  • 동적 포트
  • 데이터 유형 인식 연결
  • 내장된 Qt 위젯
  • 1개 출력에서 ​​여러 입력 연결로
  • JSON 기반 인터페이스 스타일
  • JSON 파일에 장면 저장
  • 사용자 정의 노드 지오메트리
  • 수직 및 수평 그래프 레이아웃
  • 실행취소/다시실행, 복제(CTRL+D)

빌딩

Qt6 대신 Qt5 버전으로 빌드하려면 이 옵션을 false로 설정하세요.

USE_QT6

mkdir build && cd build && cmake .. -DUSE_QT6=on
or
mkdir build && cd build && cmake .. -DUSE_QT6=off

정적 라이브러리로 빌딩

cmake .. -BUILD_SHARED_LIBS=off

리눅스

git clone git@github.com:paceholder/nodeeditor.git
cd nodeeditor
mkdir build
cd build
cmake ..
make -j && make install

Qt Creator


  1. CMakeLists.txt를 프로젝트로 엽니다.
  2. Catch2 라이브러리가 설치되어 있지 않은 경우 빌드 설정으로 가서 BUILD_TESTING 체크박스를 비활성화합니다.
  3. Build -> Run CMake
  4. Build -> Build All
  5. 실행 버튼을 클릭하세요

vcpkg를 사용하여 Cmake를 사용합니다.

  1. vcpkg 설치
  2. CMake 구성 단계에 다음 플래그를 추가합니다.
-DCMAKE_TOOLCHAIN_FILE=<vcpkg_dir>/scripts/buildsystems/scripts/buildsystems/vcpkg.cmake
728x90
반응형
반응형

Qt Mustache : Qt를 사용한 Mustache 템플릿 라이브러리

qt-mustache는 Mustache 템플릿 을 렌더링하기 위한 간단한 라이브러리입니다.

사용 예

#include "mustache.h"

QVariantHash contact;
contact["name"] = "John Smith";
contact["email"] = "john.smith@gmail.com";

QString contactTemplate = "<b>{{name}}</b> <a href=\"mailto:{{email}}\">{{email}}</a>";

Mustache::Renderer renderer;
Mustache::QtVariantContext context(contact);

QTextStream output(stdout);
output << renderer.render(contactTemplate, &context);
  • 출력: <b>John Smith</b> <a href="mailto:john.smith@gmail.com">john.smith@gmail.com</a>

추가 예제는 test_mustache.cpp의 테스트를 참조하세요.

빌딩

  • 테스트를 빌드하려면 qmake를 실행한 다음 make를 실행합니다.

  • 프로젝트에서 qt-mustache를 사용하려면 mustache.hmustache.cpp 파일을 프로젝트에 추가하기만 하면 됩니다.

라이센스

qt-mustache는 BSD 라이센스에 따라 라이센스가 부여되었습니다.

종속성

qt-mustache는 QtCore 라이브러리에 따라 다릅니다. Qt 5 및 Qt 6과 호환됩니다.

용법

구문

qt-mustache는 표준 Mustache 구문을 사용합니다. 자세한 내용은 Mustache 매뉴얼 을 참조하세요.

데이터 소스

Qt-mustache은 mustache의 값을 사용하여 mustache 태그를 확장합니다::Context. Mustache::QtVariantContext는 QVariantHash 또는 QVariantMap을 감싸는 간단한 컨텍스트 구현입니다. 사용자 지정 데이터 소스를 사용하여 템플릿을 렌더링하려는 경우 데이터 소스를 미러링하는 QVariantHash를 만들거나 Nowsters::Context를 다시 구현할 수 있습니다.

부분

{{>partial}} Mustache 태그가 발견되면 qt-mustache는 Mustache::PartialResolver를 사용하여 partial을 로드하려고 시도합니다. 컨텍스트에서 제공됩니다. Mustache::PartialMap은 부분 이름의 QHash<QString,QString> 맵을 취하는 간단한 리졸버입니다. 값으로 이동하고 해당 맵에서 부분을 찾습니다. Mustache::PartialFileLoader는 또 다른 간단한 리졸버입니다. 지정된 디렉토리의 <partial name>.mustache 파일에서 부분을 가져옵니다.

사용자 정의 소스에서 파셜을 로드하려면 Mustache::PartialResolver 인터페이스를 다시 구현할 수 있습니다. (예: 데이터베이스).

오류 처리

템플릿을 렌더링하는 동안 오류가 발생하면 Mustache::Renderer::errorPosition()이 음수가 아닌 값으로 설정됩니다. 템플릿 렌더링이 중지됩니다. 부분 템플릿을 렌더링하는 동안 오류가 발생하면 errorPartial()에 이름이 포함됩니다. 부분적인 것의.

람다

Mustache 매뉴얼 은 렌더링을 사용자 정의하는 메커니즘을 제공합니다. 태그의 값을 호출 가능한 객체(예: Ruby 또는 Javascript의 람다)로 설정하여 템플릿 섹션을 만듭니다. 렌더링되지 않은 텍스트 블록을 템플릿 섹션으로 가져와서 자체적으로 렌더링합니다. qt-mustache는 다음을 지원합니다. Context::canEval()Context::eval() 메서드를 통해 이를 수행할 수 있습니다.

728x90
반응형
반응형

Qt6 QVariant::type() 대체

Qt6에서는 QVariant::type() 메서드가 더 이상 권장되지 않으며, 대신 typeId() 또는 metaType()을 사용하는 것이 좋습니다. typeId()QVariant에 저장된 데이터의 QMetaType::Type을 반환하고, metaType()QMetaType 객체 자체를 반환합니다.

다음은 type()typeId() 또는 metaType()으로 대체하는 방법입니다.

기존 코드(Qt5):

QVariant value = ...;
QVariant::Type type = value.type();

수정된 코드(Qt6):

  1. typeId() 사용: QVariant의 타입을 QMetaType::Type 형태로 반환합니다.

    QMetaType::Type type = static_cast<QMetaType::Type>(value.typeId());
    
  2. metaType() 사용: QMetaType 객체 자체를 사용하여 타입을 확인할 수 있습니다.

    QMetaType metaType = value.metaType();
    if (metaType == QMetaType::fromType<int>()) {
        // int 타입일 경우 처리
    }
    

이렇게 typeId()metaType()을 사용하여, 더 이상 type() 함수를 호출할 때 나타나는 경고를 해결할 수 있습니다.

728x90
반응형
반응형

Qt6 QStyleOptionHeader::init() 대체 방법

Qt6에서는 QStyleOptionHeader::init() 함수가 더 이상 존재하지 않습니다. 대신 QStyleOptionHeader 객체를 초기화할 때, 직접 QStyleOption의 기본 초기화 함수인 QStyleOption::initFrom()을 사용하는 방식으로 대체할 수 있습니다. 이를 통해 헤더의 스타일 옵션을 위젯으로부터 초기화할 수 있습니다.

다음은 QStyleOptionHeader::init()을 대체하는 방법입니다.

기존 코드(Qt5):

QStyleOptionHeader option;
option.init(widget);

수정된 코드(Qt6):

QStyleOptionHeader option;
option.initFrom(widget);  // initFrom을 사용해 위젯으로부터 초기화

이처럼 initFrom 메서드를 사용하면 widget의 상태와 속성을 사용하여 option을 초기화할 수 있습니다.

728x90
반응형
반응형

Qt6 qSort 대체 방법

1. QVector를 정렬하는 경우

Qt6에서는 qSort가 더 이상 사용되지 않습니다. 대신 C++ 표준 라이브러리에서 제공하는 std::sort를 사용해야 합니다. Qt5까지는 qSort가 제공되었으나, Qt6부터는 이를 표준 C++ 정렬 함수로 대체해야 합니다.

기존 코드(Qt5):

QVector list;
qSort(list.begin(), list.end());

수정된 코드(Qt6, C++ 표준 라이브러리 사용):

std::sort(list.begin(), list.end());

qSort는 Qt의 전용 함수였지만, C++11 이후로 std::sort가 더 널리 사용되고 권장되므로 Qt6에서는 std::sort를 사용하는 것이 적절합니다.


2. QList를 정렬하는 경우

정렬하려는 값이 QList의 경우, Qt6에서는 std::sort를 사용할 수 없습니다. QList는 기본적으로 std::vector와 같은 임의 접근(iterable) 반복자를 제공하지 않기 때문에, std::sort와 같은 알고리즘에 사용할 수 없습니다. 대신, QList의 멤버 함수인 sort()를 직접 사용할 수 없기 때문에 다른 방식으로 정렬을 구현해야 합니다.

QList 정렬 방법:

  1. QList를 QVector로 변환 후 정렬: QListQVector로 변환한 다음, std::sort를 적용한 후 다시 QList로 변환하는 방법이 있습니다.

    QVector<int> vec = list.toVector();
    std::sort(vec.begin(), vec.end());
    list = QList<int>::fromVector(vec);
    
  2. QList::operator< 사용: 만약 간단한 정렬 기준을 적용하려면 QListoperator<를 이용하여 std::sort 대신 QListsort() 함수를 이용할 수 있습니다.

  3. 람다 함수 사용: 만약 특정 기준으로 정렬하고 싶다면, 람다 함수를 이용할 수 있습니다. 이를 통해 QVector로 변환하지 않고도 직접 원하는 방식으로 비교 연산을 할 수 있습니다.

일반적으로 QList보다는 QVectorstd::vector와 같은 컨테이너를 사용하는 것이 더 효율적일 수 있으므로, 상황에 따라 데이터 구조를 변경하는 것도 고려해 볼 수 있습니다.

728x90
반응형
반응형

QHexView : Qt용 다재다능 16진수 위젯

QHexView logo

특징


  • 문서(Document)/뷰(View) 기반
  • 무제한 실행취소/다시실행
  • 완전 사용자 정의 가능
  • 빠른 렌더링
  • 사용하기 쉽습니다

백엔드


사용 가능한 버퍼 백엔드는 다음과 같습니다.

  • QMemoryBuffer : 간단하고 플랫(flat)한 메모리
  • QMemoryRefBuffer : QHexView는 참조된 데이터만 표시하고 편집은 비활성화됩니다.
  • QDeviceBuffer : QIODevice에 대한 읽기 전용 뷰
  • QMappedFileBuffer : QFile용 MMIO 래퍼

처음부터 새로운 데이터 백엔드를 만드는 것도 가능합니다.

용법


데이터는 QHexDocument 클래스를 통해 QHexView에서 관리됩니다. 다양한 버퍼 백엔드를 사용하여 QHexDocument의 fromDevice() 메서드를 사용하여 일반적인 QIODevice를 로드하는 것이 가능합니다. QFile을 메모리 내 버퍼로 로드하기 위해 도우미 메서드가 제공됩니다.

#include <QHexView/qhexview.h>

QHexOptions options;
options.grouplength = 2; // Pack bytes as AABB
options.bytecolors[0x00] = {Qt::lightGray, QColor()}; // Highlight '00's
options.bytecolors[0xFF] = {Qt::darkBlue, QColor()};  // Highlight 'FF's
hexview.setOptions(options);

QHexDocument* document = QHexDocument::fromMemory<QMemoryBuffer>(bytearray); /* Load data from In-Memory Buffer... */
//QHexDocument* document = QHexDocument::fromDevice<QMemoryBuffer>(iodevice); /* ...from a generic I/O device... */
//QHexDocument* document = QHexDocument::fromFile<QMemoryBuffer>("data.bin"); /* ...or from File... */

QHexView* hexview = new QHexView();
hexview->setDocument(document);                  // Associate QHexEditData with this QHexEdit (ownership is not changed)

// Document editing
QByteArray data = document->read(24, 78);        // Read 78 bytes starting to offset 24
document->insert(4, "Hello QHexEdit");           // Insert a string to offset 4 
document->remove(6, 10);                         // Delete bytes from offset 6 to offset 10 
document->replace(30, "New Data");               // Replace bytes from offset 30 with the string "New Data"

// Metatadata management (available from QHexView too)
hexview->setBackground(5, 10, Qt::Red);         // Highlight background at offset range [5, 10)
hexview->setForeground(15, 30, Qt::darkBLue);   // Highlight background at offset range [15, 30)
hexview->setComment(12, 42, "I'm a comment!");  // Add a comment at offset range [12, 42)
hexview->unhighlight();                         // Reset highlighting
hexview->clearMetadata();                       // Reset all styles
728x90
반응형

'Qt' 카테고리의 다른 글

Qt6 QStyleOptionHeader::init() 대체  (0) 2024.10.25
Qt6 qSort 대체  (0) 2024.10.25
Qt6 온라인 헬프 한국어 번역  (0) 2024.10.21
PDF 퀴크 (PDF Quirk) : Qt PDF 유틸리티  (1) 2024.10.19
wble : 유용한 Qt 위젯 라이브러리  (0) 2024.10.18
반응형

 

https://doc.qt.io/qt-6/ko/

 

Qt 6.8

 

doc.qt.io

 

* 번역이 이상한 부분은 버그 신고해달라고 합니다. (물론 신고는 영어로) https://bugreports.qt.io/

 

Loading...

To move an item, select with Space and move with Ctrl/Cmd + Arrow keys

bugreports.qt.io

 

728x90
반응형
반응형

PDF 퀴크 (PDF Quirk) : Qt PDF 유틸리티

이미지나 스캐너로 PDF를 쉽게 만들 수 있습니다.

pdfquirk 스크린샷

PDF Quirk는 하드디스크나 스캐너에 있는 이미지 파일에서 PDF를 만드는 작은 유틸리티입니다.

이는 Linux의 표준 스캔 솔루션인 Imagemagick의 안정적이고 널리 사용되는 도구인 convert와 SANE 프로젝트의 scanimage를 활용합니다.

PDF Quirk는 무료 소프트웨어입니다. 기여를 환영합니다.

자세한 내용은 PDF Quirk 웹사이트에서 확인하세요.

728x90
반응형
반응형

wble : 유용한 Qt 위젯 라이브러리

프로젝트 소개

유용한 Qt 위젯 라이브러리. Volbx 프로젝트의 코드를 분할하고 일부를 독립 라이브러리로 옮긴 결과로 생성되었습니다. 라이브러리에는 다음이 포함됩니다.

  • 더블 슬라이더
  • 숫자 필터(정수 및 이중 1)
  • 문자열 필터
  • 날짜 필터
  • 무한 진행률 표시줄
  • 카운터 진행률 표시줄

빌드하기

CMake를 직접 또는 Qt Creator를 통해 복제하고 사용합니다. CMake는 해야 합니다:

  • 모든 것을 자동으로 구성합니다.
  • 라이브러리를 컴파일하고 바이너리를 생성합니다.

: CMAKE_PREFIX_PATH 환경 변수를 올바르게 설정하는 것을 잊지 마세요. CMake find_package 명령이 작동하도록 Qt 설치 경로가 있어야 합니다.

컴파일 결과, 헤더 디렉토리와 함께 동적 라이브러리가 생성되어야 합니다.

CMake를 통해 외부 프로젝트로 사용하려면 Volbx라는 다른 프로젝트에서 어떻게 하는지 확인할 수 있습니다.

사용된 도구 및 라이브러리

도구 Windows Lubuntu
OS 버전 10 22H2 22.04
GCC 11.2.0 11.3.0
CMake 3.25.0 3.25.0
2.38.1 2.34.1
Qt 6.5.2 6.5.2
Qt Creator 10.0.2 10.0.2

사용법

가장 쉬운 방법은 예제 하위 프로젝트를 확인하는 것입니다. 여기서 이 라이브러리에 포함된 각 위젯을 생성하고 상호작용하는 방법을 찾을 수 있습니다.

또는 테스트 하위 프로젝트를 확인할 수 있습니다. 사용법은 Volbx라는 다른 프로젝트에서도 찾을 수 있으며, 이 라이브러리의 위젯이 사용됩니다.

위젯

더블 슬라이더 (Double slider)

각 핸들은 독립적으로 움직일 수 있습니다. 더블 슬라이더를 편리한 조절 가능한 위젯으로 감싸는 Integer 및 Double 필터도 확인하세요.

필터 (Filters)

각 필터 위젯은 QGroupBox에서 상속받습니다. 즉, 모든 필터는 체크 가능하거나 체크 불가능할 수 있습니다. 표준 setCheckable()을 사용하여 동작을 변경합니다.

정수 필터 (Integer filter)

조절 가능한 위젯으로 이중 슬라이더를 감쌋습니다. 정수 값에 전용입니다.

더블 필터 (Double filter)


조절 가능한 위젯으로 감싼 더블 슬라이더. 더블 값에 전용.

날짜 필터 (Date filter)

사용자 지정 날짜 범위를 선택할 수 있는 위젯입니다. 추가 "빈 날짜가 있는 데이터 무시" 확인란을 사용하여 빈 날짜가 있는 데이터 항목을 필터링할 수 있습니다.

문자열 필터 (String filter)

여러 문자열 값을 필터링된 세트로 선택할 수 있는 위젯. 필터에서 모든 문자열 값을 빠르게 선택 취소/선택 해제하기 위한 추가 체크박스 "모두 선택/선택 취소".

진행률 표시줄 (Progress bars)

긴 작업의 진행 상황을 보여줄 수 있는 위젯. 블렌드인 위젯이나 모달 위젯으로 사용할 수 있습니다.

무한 진행률 표시줄 (Infinity progress bar)

종료 시간을 알 수 없는 작업에 사용할 수 있습니다. 진행률 표시줄은 중지되거나 파괴될 때까지 움직이는 호를 표시합니다.

카운터 진행률 표시줄 (Counter progress bar)


종료 시간이 알려진 작업에 사용할 수 있습니다. 진행률 막대는 0에서 100%로 이동하는 호를 표시합니다. 가운데에는 현재 백분율이 표시됩니다.

728x90
반응형

+ Recent posts