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

C++14 : C++11을 더욱 발전시킨 Modern C++

  • C++14C++11을 기반으로 한 소규모 개정판 으로, 기존 기능을 더욱 개선하고 실용적인 기능을 추가한 표준입니다.

  • C++11이 도입한 스마트 포인터, auto, 람다 표현식 등의 혁신적인 기능을 다듬고,
    템플릿과 constexpr의 활용도를 높이는 기능을 포함하여 코드의 가독성과 유지보수성을 향상 시켰습니다.


  • 이번 글에서는 C++14에서 새롭게 추가된 기능들만 정리하여 소개하겠습니다.


1. 반환형 자동 유추 (Return Type Deduction)

  • C++14에서는 함수의 반환형을 auto로 선언하면 자동으로 유추됩니다.

  • cpp

      auto add(int a, int b) { return a + b; } // 반환형이 int로 자동 결정
    

  • 함수의 반환형을 일일이 명시하지 않아도 되므로, 가독성과 유지보수가 쉬워집니다.


2. 제네릭 람다 (Generic Lambda)

  • 이제 람다 함수의 매개변수 타입을 auto로 선언할 수 있습니다.

  • cpp

      auto lambda = [](auto a, auto b) { return a + b; };
      std::cout << lambda(3, 4.5) << std::endl; // 7.5
    

  • 템플릿을 사용하지 않고도 다양한 타입을 지원하는 람다를 쉽게 만들 수 있습니다.


3. decltype(auto)

  • C++14에서는 decltype(auto)를 사용해 반환 타입을 더욱 정밀하게 지정할 수 있습니다.

  • cpp

      int x = 10;
      int& foo() { return x; }
    
      decltype(auto) y = foo(); // y는 int& 타입
    

  • 함수나 변수의 원래 타입을 유지하는 데 유용합니다.


4. constexpr 함수 확장

  • C++14에서는 constexpr 함수 내에서 if문, 반복문 등의 논리를 사용할 수 있습니다.

  • cpp

      constexpr int factorial(int n) {
          int result = 1;
          for (int i = 2; i <= n; ++i)
              result *= i;
          return result;
      }
    

  • 컴파일 타임 연산을 더욱 유연하게 사용할 수 있습니다.


5. unique_ptr 인스턴스 생성 (std::make_unique)

  • C++14에서는 std::unique_ptr을 보다 쉽게 생성할 수 있도록 std::make_unique가 추가되었습니다.

  • cpp

      #include <memory>
      auto ptr = std::make_unique<int>(42);
    

  • 메모리 할당을 안전하고 간결하게 처리할 수 있습니다.


6. 숫자 리터럴 구분자 (Digit Separator)

  • 숫자 리터럴에서 단일 따옴표(')를 사용하여 가독성을 높일 수 있습니다.

  • cpp

      int num = 1'000'000; // 1000000과 동일
    

  • 큰 숫자의 가독성을 개선하는 간단하지만 유용한 기능입니다.


7. 변수 템플릿 (Variable Templates)

  • 템플릿을 변수 로도 선언할 수 있습니다.

  • cpp

      template<typename T>
      constexpr T pi = T(3.141592653589793);
    
      std::cout << pi<double> << std::endl; // 3.14159...
    

  • 템플릿을 변수로 활용할 수 있어 코드가 더욱 간결해집니다.


8. 정수 시퀀스 (std::integer_sequence)

  • 템플릿 프로그래밍에서 정수 시퀀스를 다룰 수 있도록 std::integer_sequence가 추가되었습니다.

  • cpp

      #include <utility>
      template <typename T, T... Ints>
      void print_sequence(std::integer_sequence<T, Ints...>) {
          ((std::cout << Ints << " "), ...);
      }
      
      int main() {
          print_sequence(std::integer_sequence<int, 1, 2, 3, 4>{}); // 1 2 3 4
      }
    

  • 템플릿 메타프로그래밍에서 정수 시퀀스를 더 쉽게 활용할 수 있습니다.


9. 변수 변경 반환 (std::exchange)

  • 값을 다른 값으로 바꾸고, 원래 값을 반환하는 함수가 추가되었습니다.

  • cpp

      #include <utility>
      int x = 10;
      int old_x = std::exchange(x, 20); // x는 20이 되고, old_x는 10
    

  • 객체의 값 변경과 이전 값을 동시에 처리할 때 유용합니다.


정리

  • C++14C++11을 기반으로 더 직관적이고 강력한 코드 작성이 가능하도록 개선된 표준 입니다.

  • 특히 제네릭 람다, constexpr 확장, std::make_unique 은 코드의 간결성과 안전성을 향상시키는 기능들입니다.

  • C++14의 추가 기능을 적극 활용 하여 더 효율적인 코드를 작성해 보세요! 🚀

728x90
반응형
728x90
반응형

Bitsery 소개

  • 링크 : https://github.com/fraillt/bitsery

  • 헤더(header) 전용 C++ 이진 직렬화(binary serialization) 라이브러리.

  • 실시간 데이터 전송, 특히 게임의 네트워킹 요구 사항을 중심으로 설계되었습니다.

  • 모든 크로스 플랫폼 요구 사항은 컴파일 타임에 시행되므로 직렬화된 데이터는 메타 데이터 정보를 저장하지 않으며 가능한 작습니다.

특징

  • 크로스 플랫폼 호환
  • 속도와 공간에 최적화되었습니다.
  • 코드 생성이 필요하지 않습니다. IDL이나 메타 데이터가 없어도 직접 유형을 사용하십시오.
  • 직렬화 해제시 구성 가능한 런타임 오류 점검.
  • 스트림 (파일, 네트워크 스트림 등 ...) 또는 버퍼 (벡터, c- 어레이 등) 등 모든 소스에서 읽고 쓸 수 있습니다.
  • 사용하지 않는 것에 대한 비용을 지불하지 마십시오! -확장을 통해 직렬화를 사용자 정의하십시오. 몇 가지 주목할만한 확장은 다음을 허용합니다.
    • 유형에 대한 순방향 / 역방향 호환성.
    • 맞춤형 런타임 다형성을 지원하는 스마트하고 생생한 포인터.
    • 세분화 된 비트 수준 직렬화 제어.
  • 모든 유형에 쉽게 확장 할 수 있습니다.
  • 직렬화 제어를 개선하기 위해 간단한 구문 및 / 또는 자세한 구문을 허용합니다.
  • 구성 가능한 엔디안 지원.
  • 매크로가 없습니다.

bitery 를 사용하는 이유

  • 숫자와 기능 목록을 보고 스스로 결정하십시오.
data size serialize deserialize
bitsery 6913B 1252ms 1170ms
bitsery_compress 4213B 1445ms 1325ms
boost 11037B 9952ms 8767ms
cereal 10413B 6497ms 5470ms
flatbuffers 14924B 6762ms 2173ms
yas 10463B 1352ms 1109ms
yas_compress 7315B 1673ms 1598ms
  • GCC 8.3.0으로 Ubuntu에서 벤치마킹 한 자세한 내용은 here 를 참조하십시오.

  • 여전히 확신이 없다면 라이브러리 동기 부여 섹션에서 더 많은 것을 읽으십시오.

사용 예

#include <bitsery/bitsery.h>
#include <bitsery/adapter/buffer.h>
#include <bitsery/traits/vector.h>

enum class MyEnum:uint16_t { V1,V2,V3 };
struct MyStruct {
    uint32_t i;
    MyEnum e;
    std::vector<float> fs;
};

template <typename S>
void serialize(S& s, MyStruct& o) {
    s.value4b(o.i);
    s.value2b(o.e);
    s.container4b(o.fs, 10);
}

using namespace bitsery;

using Buffer = std::vector<uint8_t>;
using OutputAdapter = OutputBufferAdapter<Buffer>;
using InputAdapter = InputBufferAdapter<Buffer>;

int main() {
    MyStruct data{8941, MyEnum::V2, {15.0f, -8.5f, 0.045f}};
    MyStruct res{};

    Buffer buffer;

    auto writtenSize = quickSerialization<OutputAdapter>(buffer, data);
    auto state = quickDeserialization<InputAdapter>({buffer.begin(), writtenSize}, res);

    assert(state.first == ReaderError::NoError && state.second);
    assert(data.fs == res.fs && data.i == res.i && data.e == res.e);
}

사용 방법

요구사항

  • 추가 종속성 없이 C++11 컴파일러와 함께 작동하며 <bitsery/bitsery.h> 가 포함되어 있습니다.

    일부 bitsery 확장은 더 높은 버전의 C++ 표준(예: StdVariant)이 필요할 수 있습니다.

플랫폼

  • 이 라이브러리는 다음에서 테스트되었습니다
    • Windows: Visual Studio 2015, MinGW (GCC 5.2)
    • Linux: GCC 5.4, GCC 6.2, Clang 3.9
    • OS X Mavericks: AppleClang 8

라이센스

  • bitsery 는 MIT license 입니다.
728x90
반응형

'C C++' 카테고리의 다른 글

[리눅스] C++ 에서 칼라 글자 출력  (0) 2021.05.16
나노로그(NanoLog)  (0) 2020.03.03
C++ std::any  (0) 2019.08.22
libcurl 빌드 하기 (Visual Sutdio)  (0) 2019.08.15
Serial (KMDF) sample driver's DriverEntry routine  (0) 2019.01.17
728x90
반응형

QSLogLib

  • 홈페이지 : https://github.com/JayTwoLab/QSLogLib

  • QSLogLib는 SLogLib를 Qt로 이식한 로깅 라이브러리 입니다.

  • 향상된 장치와 기능으로 Qt로 포팅되었습니다.

노트

  • Cmake는 더 이상 지원하지 않습니다.
  • 크로스 플랫폼 지원을 위한 복잡한 코드 대신에 Qt를 사용합니다.
  • UDP 클라이언트 로거가 추가되었습니다.

예제

1️⃣ 설정 방법

  • 처음에 Qt 프로젝트 파일(*.pro)에 pri 파일을 추가합니다.
  • qmake

    # Define QSLogLib relative path. You can fix this directory
    #   QSLOG_PARENTPATH = ../../
    #   QSLOG_HEADERPATH = ../../QSLogLib/
    #   QSLOG_SOURCEPATH = ../../QSLogLib/
    include(../../QSLogLib/QSLogLib.pri)
    

2️⃣ 표준 출력/파일 로깅 예제

  • cpp

    #include <QtGlobal>
    #include <QCoreApplication>
    
    #include "QSLogLib/SLogLib.h"
    #include "QSLogLib/Devices/AbstractLoggingDevice.h"
    #include "QSLogLib/Devices/ConsoleLogger.h"
    #include "QSLogLib/Devices/FileLogger.h"
    #include "QSLogLib/Devices/UdpLogger.h"
    #include "QSLogLib/Formatters/AbstractFormatter.h"
    #include "QSLogLib/Formatters/DetailedFormatter.h"
    #include "QSLogLib/Formatters/ErrorFormatter.h"
    #include "QSLogLib/Formatters/InfoFormatter.h"
    #include "QSLogLib/Formatters/NullFormatter.h"
    
    int main(int argc, char *argv[])
    {
        QCoreApplication mainApp(argc, argv);
    
        using namespace QSLogLib;
    
        // 로깅 장치 추가 
        addLoggingDevice( new ConsoleLogger(new NullFormatter) ); // 콘솔(console) + 단순 로깅 형식(null format)
        addLoggingDevice( new FileLogger("foo.log", new DetailedFormatter) ); // 파일(file) + 자세한 로깅 형식(detailed format)
    
        // 콘솔과 파일 모두로 로그가 출력됨
        int a = 10;
        double b = 15.3;
        const char* c = "Success";
        SLOGLIB_LOG_MSG_INFO("a = " << a << " b = " << b);
        SLOGLIB_LOG_MSG_INFO(c);
    
        return 0;
    }
    

3️⃣ UDP 송신 예제

  • cpp

    int main(int argc, char *argv[])
    {
    	QCoreApplication mainApp(argc, argv);
    
    	using namespace QSLogLib;
    
    	std::string strDestAddress = "192.168.137.1";
    	unsigned short destPort = 5000;
    	addLoggingDevice(new UdpLogger(strDestAddress, destPort, new NullFormatter));
    
    	// UDP 패킷으로 로그를 송신
    	int a = 10;
    	double b = 15.3;
    	const char* c = "Success";
    	SLOGLIB_LOG_MSG_INFO("a = " << a << " b = " << b);
    	SLOGLIB_LOG_MSG_INFO(c);
    
    	return 0;
    }
    

테스트 환경

  • Qt 6.0.0 (MingW, Windows 64bit)
  • Qt 5.10.1 (MingW, Windows 32bit)
  • Qt 5.6.2 (Linux 64bit)

라이센스

  • QSLogLib는 MIT 라이센스입니다.
728x90
반응형
728x90
반응형

QPing

노트

  • ICMP 프로토콜을 사용하는 함수를 호출하지 않도록 구성하였습니다.
    • 저는 예전에 로소켓을 사용하는 유사한 클래스를 만든 적이 있습니다.
    • 하지만 그런 경우 사용자 계정의 권한 상승이 필요합니다. root, superuser, admin 등

설정 방법

  • QPing.h, QPing.cpp 를 여러분의 프로젝트에 복사하세요.

  • 여러분의 Qt 프로젝트(*.pro)에 해당 소스 코드를 추가하세요.

  • qmake

    HEADERS += QPing.h
    SOURCES += QPing.cpp
    
  • 클래스를 활용하는 소스 코드를 넣으세요. main.cpp를 참조하세요.

  • cpp

    // main.cpp
    #include "QPing.h"
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QString destIpAddress = "192.168.0.1";
        if ( argc == 2 )
        {
            // You can use application first parameter
            // For example) QPingSF 192.168.100.10
            QString strArg = argv[1];
            destIpAddress = strArg;
        }
    
        // 각 OS 별 INI 파일을 참조하세요. 자신만의 INI 파일을 만들 수 있습니다.
        // QString iniFilePath = "./ping-config-win-en.ini"; // Windows, English
        QString iniFilePath = "./ping-config-win-kr.ini"; // Windows, Korean
        // QString iniFilePath = "./ping-config-linux-en.ini"; // Linux, English
    
        QPing qp;
         
        qp.setIniFile( iniFilePath ); // 환경 파일을 설정
        if ( ! qp.loadIniFile() )
        {
            std::cout <<  "[ERROR] Failed to load ini file" << std::endl;
            return (-1);
        }
    
        // Ping!
        QPing::pingResult result = qp.ping(destIpAddress);
    
        switch( result )
        {
            case QPing::pingSuccess:
                std::cout <<  "Success to ping" << std::endl;
            break;
    
            case QPing::pingFailed:
                std::cout <<  "Failed to ping" << std::endl;
            break;
    
            case QPing::initFailed: // 초기화 실패
                std::cout <<  "[ERROR] Initialization is failed" << std::endl;
            break;
    
            case QPing::notFound: // 비정상 결과값
                std::cout <<  "[ERROR] Result is not found" << std::endl;
            break;
        }
    
        return 0;  
    }
    
728x90
반응형
728x90
반응형


  • QXlsx는 엑셀 파일(*.xlsx)을 읽고 쓰는 라이브러리입니다.
    • QtXlsx가 더 이상 지원되지 않기 때문에(2014), QtXlsx에 기반한 새로운 프로젝트를 만들었습니다. (2017-)
  • QXlsx는 개발언어로 C++을 사용합니다. (Qt 사용)
  • QXlsx는 정적 또는 동적 라이브러리를 사용하지 않아도 되도록 제작되었습니다.
    • 물론 정적 라이브러리(static library)로 사용할 수도 있습니다.
728x90
반응형
728x90
반응형
// main.cpp (C++11 unique_ptr, shared_ptr, weak_ptr)
// main code from http://www.gisdeveloper.co.kr/?p=2094
#include <memory>
#include <iostream>
using namespace std;
void test_unique_ptr();
void test_unique_ptr2();
void test_shared_ptr();
void test_move();
void test_weak_ptr();
void test_shared_weak_ptr();
int main(int argc, char *argv[])
{
test_unique_ptr();
test_unique_ptr2();
test_shared_ptr();
test_move();
test_weak_ptr();
test_shared_weak_ptr();
return 0;
}
void test_unique_ptr()
{
cout << __FUNCTION__ << endl;
unique_ptr<int> p1(new int(10)); // making unique pointer
cout << *p1 << endl; // 10
}
void test_unique_ptr2()
{
cout << __FUNCTION__ << endl;
unique_ptr<int> p1(new int(10));
cout << *p1 << endl; // 10
// sharing unique pointer.
// unique_ptr<int> p2 = p1; // error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]'
}
void test_shared_ptr()
{
cout << __FUNCTION__ << endl;
shared_ptr<int> p1(new int(10)); // making shared pointer
shared_ptr<int> p2 = p1; // sharing shared pointer
cout << *p1 << endl; // 10
cout << *p2 << endl; // 10
cout << p2.use_count() << endl; // 2 (it's a reference count)
p1.reset();
cout << p2.use_count() << endl; // 1
p2.reset();
cout << p2.use_count() << endl; // 0
}
void test_move()
{
cout << __FUNCTION__ << endl;
unique_ptr<int> p1(new int(10)); // making unique pointer
cout << *p1 << endl; // 10
unique_ptr<int> p3 = move(p1); // moving unique pointer (it is not sharing)
// cout << *p1 << endl;
cout << p1.get() << endl; // 0
cout << p3.get() << endl; // pointer
}
void test_weak_ptr()
{
cout << __FUNCTION__ << endl;
shared_ptr<int> sp1(new int(10)); // making shared pointer
weak_ptr<int> wp1 = sp1; // sharing weak pointer
cout << sp1.use_count() << endl; // 1
cout << wp1.use_count() << endl; // 1
}
void test_shared_weak_ptr()
{
cout << __FUNCTION__ << endl;
shared_ptr<int> sp1(new int(10));
weak_ptr<int> wp1 = sp1;
cout << sp1.use_count() << endl; // 1
cout << wp1.use_count() << endl; // 1
{
shared_ptr<int> sp2 = wp1.lock();
cout << sp1.use_count() << endl; // 2
cout << wp1.use_count() << endl; // 2
}
cout << sp1.use_count() << endl; // 1
cout << wp1.use_count() << endl; // 1
}
728x90
반응형
728x90
반응형
// for checkg support C++ (using g++)
//
// g++ -std=c++98 main.cpp
// g++ -std=c++03 main.cpp
// g++ -std=c++0x main.cpp
// g++ -std=c++11 main.cpp
// g++ -std=c++14 main.cpp
// g++ -std=c++17 main.cpp
#include <iostream>
using namespace std;
int main(){
int cpp = (int) __cplusplus;
int year = cpp / 100; // 1997 ... 2017
int month = cpp % 100;
cout << "Year:" << year << " Month:" << month << endl;
return 0;
}
728x90
반응형
728x90
반응형

Qt 안드로이드(Android) 설정

  • Qt+Android+Windows 10(64비트) 에서 설정하는 간단한 팁을 소개합니다.
  • 사실 매우 쉬운 부분이지만, QtCreator 설정에 대한 설명이 불친절하여 설정하지 못하기도 합니다.

설정 순서

1️⃣ Qt MingW+Android 설치 (QtCreator가 함께 설치됨)

2️⃣ Android Studio 설치

3️⃣ Android Studio에서 기본적인 Hello World를 만들어서 구동합니다.

  • 이떄, C++를 사용하는 프로젝트를 만듭니다. (JNI)
  • 최초 구동시에는 SDK, NDK, 에뮬레이터 등을 설치해야 합니다.
  • (하지만 별로 걱정할 필요 없는 점은 안드로이드 스튜디오가 시키는 대로하면 대부분 됩니다)
  • (CPU 가상화 설정이 안되있으면, CMOS 재설정이 필요하기도 합니다.)

4️⃣ QtCreator에서 다음과 같이 설정합니다.

  • QtCreator 메뉴 : Tools → Options → Devices → Android
  • JDK 경로 : C:\Program Files\Java\jdk1.8.0 (JDK 9 또는 10은 잘 안됨. JDK8 추천)
  • SDK 경로 : C:\Users\사용자계정\AppData\Local\Android\Sdk
  • NDK 경로 : C:\Users\사용자계정\AppData\Local\Android\Sdk\ndk-bundle

5️⃣ QML을 사용하는 프로젝트를 만들고, 만드는 중에 툴체인을 Android로 설정합니다.

  • 안드로이드 에뮬레이터에 헬로우 월드가 뜨면 성공입니다.

기타

  • QtCreator 와 Android Studio의 기본적인 기능을 사용할 줄 안다는 가정하에 글을 작성합니다.
  • 기본적인 내용을 잘모르시는 분은 Qt 싸이트(qt.io)와 Google 안드로이드 싸이트의 도움말을 통하여 기본적인 학습 후에 설정하시면 됩니다.
  • 출처: http://j2doll.tistory.com/594 [어쩌다가 휴식 중]
728x90
반응형
728x90
반응형

Qt 유지보수 도구 Maintenance Tool URL

Q&A

주의

  • 이 정보는 Qt Company의 저장소 운용정책에 따라 언제든 변할 수 있습니다.
  • 자료작성 시기는 2018년 상반기 입니다.

기타

728x90
반응형
728x90
반응형

Qxlnt

  • Qxlnt는 xlnt를 Qt에서 사용하도록 구성한 도우미 프로젝트 입니다. https://github.com/j2doll/Qxlnt

  • Qt에서 cmake를 직접 사용하여 프로젝트를 구성하기 어려운 경우, 활용해 보세요.

728x90
반응형
728x90
반응형
  • msys2를 설치 후 다음과 같은 항목들을 설치합니다.
 pacman -Syu bash pacman pacman-mirrors msys2-runtime base-devel gcc make cmake git wget p7zip 
  • github에서 xlnt 소스코드를 받습니다.
 git clone https://github.com/tfussell/xlnt.git 
  • xlnt 경로에서 빌드를 수행합니다.
 cd xlnt
 cmake -G "Unix Makefiles"
 make
  • cmake 옵션은 -G "MSYS Makefiles" 가 될 수도 있습니다. cmake --help를 통해 지원하는 항목을 확인하세요.

  • 빌드가 성공하였다면, 테스트 프로그램을 실행합니다.

 cd test
 cp ../source/msys-xlnt-1.2.dll .
 ./xlnt.test 
  • *.dll 이 있는 경로를 실행 경로로 설정하였다면, dll 을 테스트 경로로 복사하지 않아도 됩니다.

  • 다음과 같은 결과가 나오면 성공입니다.

 ......................................................................................................................................................................................................................................................................
  • 하나의 점(dot)은 단위 테스트를 성공하였음을 의미합니다.

  • 만약 테스트 중 실패가 생기면 해당 메시지를 전시합니다.

  • 필자가 수행한 테스트 환경은 다음과 같습니다. (테스트 일자는 18년 3월말)

  • 물론 테스트 환경과 코드가 다르면 결과가 다르게 나올 수 있습니다.

default-user@DESKTOP-826T7L9 MSYS /d/workspace/github/xlnt/tests
$ uname -a
MSYS_NT-10.0 DESKTOP-826T7L9 2.10.0(0.325/5/3) 2018-02-09 15:25 x86_64 Msys
default-user@DESKTOP-826T7L9 MSYS /d/workspace/github/xlnt/tests
$ gcc --version
gcc (GCC) 6.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
default-user@DESKTOP-826T7L9 MSYS /d/workspace/github/xlnt/tests
$ cmake --version
cmake version 3.10.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
default-user@DESKTOP-826T7L9 MSYS /d/workspace/github/xlnt/tests
$ make --version
GNU Make 4.2.1
x86_64-pc-msys 빌드
Copyright (C) 1988-2016 Free Software Foundation, Inc.
라이선스 GPLv3+: GNU GPL 버전 3 또는 이후 <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

다음글

728x90
반응형
728x90
반응형

void QObject::deleteLater() 함수

설명

  • 이 함수는 객체(object)의 삭제를 예약합니다.

  • 이벤트 루프(event loop)가 제어를 반환하면 객체가 삭제됩니다.

  • 이 함수가 호출될 때 이벤트 루프가 실행되고 있지 않으면, (예: QCoreApplication::exec() 전에 객체에서 deleteLater()가 호출되면,) 이벤트 루프가 시작될 때 객체가 삭제됩니다. 기본 이벤트 루프가 중지된 후 deleteLater()가 호출되면 객체가 삭제되지 않습니다.

  • Qt 4.8 이후로, 실행 중인 이벤트 루프가 없는 쓰레드(thread) 에 있는 객체에서 deleteLater()가 호출되면, 쓰레드가 완료되면 객체가 삭제됩니다.

  • 새 이벤트 루프를 시작하거나 종료하는 것은 (예: 모달(Modal) 대화상자 열기) 지연된 삭제를 수행하지 않습니다. 삭제할 개체의 경우, 제어는 deleteLater()가 호출된 이벤트 루프로 돌아와야 합니다.

  • 참고: 이 함수(deleteLater)를 두 번 이상 호출하는 것이 안전합니다. 첫번째 지연된 삭제 이벤트가 전달되면, 객체에 대한 보류 중 이벤트가 이벤트 큐(event queue)에서 제거됩니다.

  • 세부 내용은 destroyed()QPointer를 참조하십시오.

링크

728x90
반응형

+ Recent posts