이전의 Qt의 다음 주요 릴리스의 비전(vision)과 관련된 이전 게시물 이후, 우리는 Qt for Python 스토리를 설명하는 단락으로는 향후 릴리스(release)에 대해 고려한 모든 기능과 변경 사항을 공유하기에 충분하지 않다고 생각했습니다.
Qt 6 로의 전환
Qt와 같은 거대한 프레임워크를 다른 언어로 노출하는 것은 쉬운 일이 아니며 이것이 Qt 4의 이전 PySide 버전에서 Qt 5로 느리게 포팅된 주된 이유였습니다.
많은 개발자들의 시간이 새로운 Qt 5 API와 더 중요한 것은 모든 것이 올바르게 처리될 수 있도록 바인딩 생성기 도구(binding generator tool)에 적응하는 데 사용되었습니다.
Qt for Python의 개발이 Qt 6의 C++ 및 QML 스토리와 나란히 진행되고 있기 때문에 Qt 6에서는 상황이 달라집니다. 바라건대, 이번에는 놀랄 일이 거의 없을 것입니다. 실제로 이 효과는 현재 5.x 릴리스에서 볼 수 있으며 PySide2는 Qt 릴리스와 거의 동시에 사용 가능하며 경우에 따라 며칠 정도만 지연될 수 있습니다.
[역자주] PySide의 두 번째 버전(PySide2)를 'Qt for Python'이라는 제품명으로 부르고 있습니다. 두 가지 용어가 혼재되어 설명될 수 있습니다.
Qt 5.12.0의 공식 릴리스 이후 Qt for Python의 다운로드가 날마다 증가하고 있으며, 이는 커뮤니티가 프로젝트를 채택하고 즐기는 것을 의미합니다.
왜 Qt for Python을 개발하고 있습니까?
첫 번째 Qt 릴리스로 발전한 첫 번째 코드 줄은 90년대 초로 거슬러 올라갑니다. 이 코드는 파이썬 탄생과 거의 같은 날짜입니다.
두 프로젝트 모두 개발자의 삶을 편하게 하기 위한 생각으로 시작되었습니다.
두 프로젝트의 조합은 항상 좋은 아이디어였으며 PySide의 공식 출시 이후 Python 커뮤니티에 대한 Qt의 큰 발전을 보았습니다.
우리(Qt Company)는 스스로를 속일 수 없으며, python에 대한 다른 Qt 바인딩(binding) 세트 인 PyQt도 고려하지 않을 수 없었습니다.
PySide가 시작된 이래 PyQt 코드와 소스 호환성을 유지하려고 노력했습니다. PyQt 사용자는 PySide도 지원하고 있으며 주요 차이점은 대부분 import name을 변경하고 있다고 주장합니다. 이와 같은 이유로 Qt for Python 프로젝트의 배후에 계신 분들께 정말 감사하고 있습니다.
두 바인딩 세트는 상당히 성숙하지만 한 단계 더 나아가고 싶습니다. 실제로 우리는 QVariant 및 다른 것들을 노출시키지 않는 것과 같은 일부 결정적인 결정을 내렸습니다.
현재 Qt for Python에 사용하는 두 가지 유형의 개발자를 위해 다음과 같은 주요 내용이 있습니다.
C++ 개발자
빠른 프로토타이핑(prototyping) : 특정 프로젝트의 요구 사항을 고려하면 너무 많은 것을 설정하지 않고 아이디어를 프로토타이핑하는 빠른 방법을 사용하는 것이 정말 편리합니다. 종종 그들은 단지 하나의 pip install pyside2 호출입니다. 약간의 반복 후 응용 프로그램에 실제로 보다 성능이 뛰어난 동작이나 강력한 형식(strongly typed)의 언어가 필요한 경우 코드를 C++로 간단하게 전환할 수 있습니다.
Python 내장(embedding) : Python 을 사용하거나 add-ons/plug-in 시스템을 통해 또는 응용 프로그램의 다른 측면을 조작하기 위해 내장된 인터프리터(interpreter)를 사용하여 기존 응용 프로그램을 확장할 수 있습니다.
Python 개발자
GUI 개발을 위한 강력한 프레임 워크 : Python으로 그래픽 사용자 인터페이스를 작성하는 많은 옵션이 있지만 Qt는 멋진 GUI에 대한 대부분의 요구 사항을 충족하는 것으로 입증된 완전하고 강력한 프레임워크를 제공합니다. 우리는 다른 모듈을 추적하여 다음 릴리스에 포함시킬 수 있는 좋은 아이디어를 얻었습니다.
바인딩(binding) 생성 : 파이썬 모듈을 만드는 것은 어려운 작업일 수 있으며 현재 많은 프로젝트에서 이를 달성하기 위한 간단한 인터페이스를 제공하려고 합니다. Shiboken은 모든 C++ 프로젝트를 처리할 수 있는 힘을 점점 더 많이 얻고 있습니다. 많은 코스튬과 사용자의 경험으로 인해 이 도구는 기존 C++ 프로젝트에 Python 바인딩을 제공하기에 충분합니다. 예를 들어 Gamry Instruments가 이미 한 일을 참조하십시오.
Qt for Python의 미래
Python/Pyside2의 첫 공식 Qt 릴리스 이후 많은 아이디어를 모았습니다.
몇 가지 주요 사항은 다음과 같습니다.
이름 붙이기(Naming) , 모듈의 버전 관리는 파이썬과 Qt가 독립적인 번호 매기기를 했으며, 이는 사용자에게 혼란을 주었습니다. 따라서 우리는 Qt 6부터 Qt 버전 관리를 따르기로 결정했습니다. 이름 자체 그대로 유지되는 PySide 6이 릴리스됩니다.
Python2 지원 , 2020년 초부터 Python2는 더 이상 유지 보수되지 않습니다. 우리는 동일한 작업을 수행하기로 결정했으며 PySide6가 릴리스되면 지원을 중단할 것입니다. 내부적으로 이것은 현재 Python2와 Python3을 동시에 처리하는 많은 문제를 해결합니다.
uic 및 rcc를위한 별도의 툴 세트를 갖는 툴링(tooling) 은 공식 툴의 모든 변경 사항을 추적하고 이를 변형으로 포팅해야 했기 때문에 의미가 없었습니다. 파이썬을 공식 도구에 통합하는 것이 더 나은 것 같습니다. PySide2 5.14부터는 파이썬 wrapper 대신 Qt의 uic과 rcc를 직접 사용할 수 있기를 바랍니다.
메타 위젯과 유틸리티(Meta Widgets and utilities) 는 빠른 개발을 위해 파이썬 개발자의 삶을 편하게해 줄 유틸리티와 위젯 세트를 작성하려고 합니다. NumPy, Pandas 및 기타와 같은 모듈과의 즉각적인 통합도 우리의 우선 순위 목록에 있습니다.
Qt6에 포함될 모든 새로운 기능을 적용하는 Shiboken 이 우리의 주요 초점이 될 것입니다. 다행스럽게도 버그 수정 및 새로운 기능을 제출하는 더 많은 기여자(contributor)를 확보했습니다. 결과적으로 더 성숙한 시보켄(shiboken) 릴리스를 얻는 것은 시간 문제입니다.
JIRA(PYSIDE-904)에 대한 더 완전한 목록을 읽을 수 있습니다. Qt 6에서 사용할 수 있게 될 것입니다. (우리는 최선을 다할 것이며, ☺ 약속).
Qt for Python 커뮤니티에게 진심으로 감사드립니다. 현재 작업중인 대부분의 기능은 그 곳에서 비롯되었습니다. 이러한 점을 염두에 두고 IRC 채널 #qt-pyside 에서 귀하의 우려 사항과 아이디어를 알려 주시기 바랍니다. 우리는 여러분의 생각과 Qt for Python를 어떻게 개선할 수 있는지 듣고 싶습니다.
7년 전 Qt 5가 출시되었습니다. 그 이후로, 우리 주변 세계에서 많은 것들이 바뀌었고, 이제 새로운 major 버전에 대한 비전을 정의 할 때입니다. 이 블로그 게시물은 Qt 6를 정의하는 가장 중요한 사항을 설명합니다.
Qt 6은 Qt 5 시리즈에서 수행한 작업의 연속이며 사용자에게 지장을 주지 않아야 합니다. 그러나 새로운 메이저 버전은 현재 Qt 5 시리즈에서 할 수 있는 것보다 새로운 기능, 기능을 구현하고 현재와 미래의 요구 사항을 더 잘 지원할 수있는 자유를 제공합니다.
아래에서 보다 상세하게 설명되는 바와 같이, Qt 6은 Qt 5 시리즈와의 큰 호환성을 목표로 할 것이다. 우리는 여전히 Qt 5의 새로운 버전을 연구하고 있으며 Qt 6을 정의하는 기능 중 일부를 Qt 5.14 및 Qt 5.15 LTS로 약간 축소하는 것을 목표로하고 있습니다. Qt 5.14의 기능 정지로 더 많은 R&D 초점이 Qt 6으로 전환될 예정이며, 2020년 말까지 첫번째 릴리스를 위해 Qt 6.0을 준비하는 것을 목표로 하고 있습니다. 새로운 기능에 대해 살펴보기 전에 또한 사용자가 바꾸고 싶지 않은 것을 정의하기 위해 사용자를 위한 Qt의 핵심 가치 중 일부를 기억하십시오.
Qt가 사용자에게 소중한 이유는 무엇입니까?
Qt는 다양한 시장에서 사용되고 있는 수평 제품(horizontal product)입니다. Qt가 고객과 사용자에게 제공하는 핵심 가치는 다음과 같습니다.
크로스 플랫폼(cross-platform) 특성으로, 사용자는 하나의 기술과 단일 코드 기반으로 모든 데스크탑, 모바일 및 임베디드 플랫폼에 응용 프로그램을 배포할 수 있습니다
저가형 단일 목적 장치에서 고급 복합 데스크탑 응용 프로그램 또는 연결된 시스템에 이르는 확장성(scalability)
세계적 수준의 API 및 도구 및 문서화 로 응용 프로그램 및 장치 작성이 간소화됩니다.
유지 관리성(maintainability), 안정성(stability) 및 호환성(compatibility) 으로 최소한의 노력으로 큰 코드 기반을 유지할 수 있습니다.
백만 명 이상의 사용자가 있는 대규모 개발자 에코 시스템(ecosystem)
Qt의 새로운 버전은 제품을 새로운 시장 요구에 맞게 조정하면서 위의 5가지 항목을 우리가 하고있는 일의 중심에 두어야합니다.
데스크톱 시장은 우리 제품의 근간이며 Qt에게는 강력하고 중요한 시장입니다. 이곳은 대부분의 사용자가 Qt와 처음 접촉하여 공구(tooling)의 기초를 형성하는 곳입니다. 건강을 유지하고 성장하는 것은 다른 시장에서도 성장할 수있는 전제 조건입니다.
임베디드 및 연결된 장치는 우리가 가장 큰 성장을 이루고 있는 곳입니다. 터치 스크린은 장치 수가 기하 급수적으로 증가하지만 이러한 장치의 하드웨어 가격에 대한 압박이 가중되고 있습니다. 중소형 터치 스크린과 결합된 저가형 칩셋, 마이크로 컨트롤러는 어디에서나 사용됩니다. 이러한 장치의 대부분은 기능이 비교적 단순하지만 세련되고 매끄러운 사용자 인터페이스가 필요합니다. 이러한 대량의 장치가 만들어 질 것이며, 확장성 약속을 이행할 수 있도록 제품으로 해당 공간을 목표로 삼을 수 있어야 합니다.
동시에, 디바이스 스펙트럼의 최상위에 있는 사용자 인터페이스는 수천 개의 서로 다른 화면과 많은 응용 프로그램을 포함하여 복잡성이 계속 증가할 것입니다. 2D 및 3D 요소를 하나의 사용자 인터페이스로 병합하는 것은 일반적인 증강 현실 및 가상 현실의 사용과 마찬가지로 일반적입니다.
인공 지능의 요소는 응용 프로그램 및 장치에서 더 일반적으로 사용되며 이러한 요소와 쉽게 통합할 수 있는 방법이 필요합니다.
커넥티드 디바이스의 수가 급격히 증가하고 사용자 경험에 대한 요구가 훨씬 높아짐에 따라 애플리케이션 및 디바이스 생성을 단순화하는 세계적 수준의 도구(world-class tooling)에 집중하는 것이 더욱 중요해졌습니다. UX 디자이너를 개발 워크 플로에 통합하는 것이 우리의 목표 중 하나이지만 사용자의 삶을 단순화하려는 다른 영역도 많이 있습니다.
Qt 6은 Qt의 새로운 주요 버전이 될 것입니다. 이러한 새로운 메이저 버전의 주요 목표는 2020년 이후의 요구 사항에 대해 Qt를 준비하고 코드베이스를 정리하고 유지 관리하기 쉽도록하는 것입니다. 따라서 Qt 내에서 아키텍처 변경이 필요하고 Qt 5.x 의 일부 호환성을 유지하지 않으면 완료할 수 없는 항목에 중점을 둡니다.
다음은 향후 몇 년 동안 Qt에서 변경해야 할 주요 변경 사항 중 일부입니다.
차세대 QML
QML과 Qt Quick은 지난 몇 년간 우리의 성장을 촉진한 주요 기술이었습니다. 이러한 기술을 사용하여 사용자 인터페이스를 작성하는 직관적인 방법은 당사 제품의 고유한 판매 지점입니다.
그러나 Qt 5 용으로 작성된 QML에는 몇 가지 단점과 한계가 있습니다. 이는 Qt 6으로 구현할 계획이 크게 개선될 가능성이 있음을 의미합니다. 여기에서 계획된 주요 변경 사항은 다음과 같습니다.
강력한 타이핑(strong typing)을 소개합니다. 타이핑이 약하면 사용자가 코드베이스에 큰 변화를 적용하기가 어렵습니다. 강력한 유형의 시스템을 사용하면 IDE 및 기타 도구가 이 작업에서 사용자를 지원하고 유지 관리를 대폭 간소화할 수 있습니다. 또한 더 나은 성능의 코드를 생성하고 오버헤드를 줄일 수 있습니다.
JavaScript를 QML의 선택적 기능으로 만드십시오. QML을 사용할 때 완전한 JavaScript 엔진을 사용하면 문제가 복잡해질 수 있으며 특히 마이크로 컨트롤러와 같은 저가형 하드웨어를 대상으로 할 때 오버헤드가 발생합니다. 그러나 많은 사용 사례에서 매우 유용합니다.
QML 버전 관리를 제거하십시오. QML에서 특정 조회 규칙을 단순화하고 컨텍스트 속성의 작동 방식을 변경하여 QML의 버전 관리 필요성을 제거 할 수 있습니다. 결과적으로 QML 엔진을 크게 단순화하고 Qt Quick 유지관리 작업을 크게 단순화하고 사용자의 QML 및 Qt Quick 사용을 단순화합니다.
QObject 와 QML 간의 데이터 구조 중복 제거 현재 메타 오브젝트 시스템과 QML 간에 일부 데이터 구조가 복제되어 시작 성능이 저하되고 메모리 사용량이 증가합니다. 이러한 데이터 구조를 통합함으로써 이러한 오버헤드를 대부분 줄일 수 있습니다.
런타임 생성 데이터 구조를 피하십시오. 이는 복제된 데이터 구조 중 많은 부분이 현재 런타임에 생성되는 이전 시점과 관련이 있습니다. 컴파일 타임에 대부분을 생성하는 것이 가능해야 합니다.
효율적인 C++ 및 네이티브 코드로 QML 컴파일을 지원합니다. 강력한 타이핑과 간단한 조회 규칙을 통해 QML을 효율적인 C++ 및 네이티브 코드로 변환하여 런타임 성능을 크게 향상시킬 수 있습니다.
구현 세부 사항 숨기기 지원 'Private' method들 및 property들은 QML 구성 요소에서 데이터 및 기능을 숨길 수 있는 오랜 시간 요구 사항이었습니다.
더 나은 도구(tooling) 통합. QML의 현재 코드 모델은 종종 불완전하여 리팩토링 및 컴파일 타임에 오류 감지가 불가능합니다. 위의 변경 사항으로 인해 C++ 와 경쟁할 수 있는 컴파일 타임 진단 및 향상된 리팩토링 지원을 제공 할 수 있어야 합니다.
차세대 그래픽
Qt 5.0 을 수행한 이후로 그래픽 영역에서 많은 사항이 변경되어 경쟁력을 유지하기 위해 그래픽 스택을 대폭 변경해야 했습니다.
Qt 5 에서는 OpenGL을 3D 그래픽을 위한 통합 API 로 사용했습니다. 그 이후로 많은 새로운 API 가 정의되었습니다. Vulkan 은 Linux 에서 OpenGL 의 후계자로, Apple 은 Metal 을 추진하고 있으며, Microsoft 는 Direct 3D 를 보유하고 있습니다.
이는 향후 Qt가 모든 API와 원활하게 작동해야 함을 의미합니다. 이를 가능하게하려면 RHI(Rendering Hardware Interface) 라고하는 그래픽 API(플랫폼 통합을 위한 QPA 같은)를 추상화하는 새로운 계층을 정의해야 합니다. 모든 렌더링 인프라(QPainter, Qt Quick Scenegraph 및 3D 지원)를 해당 계층의 기반으로 해야 합니다.
다른 그래픽 API 세트는 또한 다른 쉐이딩(shading) 언어를 지원해야 합니다. Qt Shader Tools 모듈은 컴파일과 런타임에 쉐이더를 크로스 컴파일하는 데 도움이 됩니다.
3D는 점점 더 중요한 역할을 수행하고 있으며 현재 제공되는 제품에는 2D 및 3D 요소가 모두 포함된 UI를 만들기 위한 통합 솔루션이 없습니다. Qt 3D 또는 3D Studio의 컨텐츠와 QML을 통합하는 것은 현재 번거롭고 일부 성능 오버헤드가 발생합니다. 또한 2D와 3D 컨텐츠간에 프레임 단위로 애니메이션과 전환을 동기화 할 수 없습니다.
Qt Quick과 3D 컨텐츠의 새로운 통합은 이 문제를 해결하는 것을 목표로 합니다. 이 경우, 완전히 새로운 렌더러(renderer)는 2D와 3D 컨텐츠를 함께 렌더링하고 둘 사이에 임의의 중첩(arbitrary nesting)을 지원합니다. 그러면 QML 이 3D UI 를 위한 UI 정의 언어로 바뀌고 UIP 형식이 필요하지 않습니다. 우리는 Qt 5.14 에서 이미 3D 를 지원하는 '새로운' Qt Quick 의 기술 미리보기를 제공할 것입니다. 자세한 정보는 별도의 블로그 게시물에서 제공됩니다.
마지막으로 그래픽 자산(graphical assets)을 위한 적절한 파이프 라인을 통해 새로운 그래픽 스택(graphics stack)을 지원을 위하여, 타겟 하드웨어 및 사용 사례에 대해 컴파일 타임(compile time)에 준비를 허용합니다. PNG 파일을 압축된 텍스처(textures)로 변환하고, 많은 파일을 텍스처 아틀라스(texture atlases)로 컴파일하고, 쉐이더(shaders)와 메시(meshes)를 최적화된 이진 형식 등으로 변환합니다.
우리는 또한 Qt 6에 통합 테마/스타일링 엔진(theming/styling engine)을 도입하는 것을 목표로 합니다. 이를 통해 데스크탑 및 모바일 플랫폼에서 Qt 위젯과 Qt Quick 모두에 고유한 모양과 느낌을 얻을 수 있습니다.
일관되고 통합된 도구(tooling)
Qt 3D Studio 와 Qt Design Studio 에서는 사용자 인터페이스를 생성하기 위한 그래픽 툴링이 두 가지로 분리되었습니다. 또한 Qt 3D Studio는 중복된 노력을 없애기 위하여 나머지 Qt leading과 약간 분리됩니다.
Qt 3D Studio에서 필요한 기능을 다시 Design Studio로 병합하여 통합할 것입니다. Design Studio는 Qt Creator와 많은 코드 및 응용 프로그램 / 플러그인 프레임 워크를 공유하여 훌륭한 디자인 경험을 제공하고 디자이너와 개발자 간의 격차를 해소 할 수있는 도구를 제공합니다.
디자인 공구(design tooling)는 Photoshop, Sketch, Illustrator, Maya, 3D Max 등과 같은 컨텐츠 제작 툴과도 잘 통합되어야 합니다.
개발자 공구(developer tooling)는 C++, QML 및 Python에 대해 동급 최고의 지원을 제공할 수 있도록 많은 집중과 주의가 필요합니다. 통합 툴링 오퍼링은 개발자가 Qt Creator 내에서 설계 기능을 쉽게 사용할 수 있으며, UX 디자이너는 프로젝트 컴파일 또는 장치 내 테스트와 같은 개발자 툴링의 기능을 활용할 수 있음을 의미합니다.
Qt 5에서 사용되는 빌드 시스템으로서 QMake 에는 많은 단점과 한계가 있습니다. Qt 6의 경우 CMake 를 표준 타사 빌드 시스템으로 사용하여 Qt 자체를 빌드하는 것이 목표입니다. CMake는 C++ 세계에서 가장 널리 사용되는 빌드 시스템이므로 더 나은 통합이 필요합니다. 우리는 QMake에서 사용자를 계속 지원하지만 더 발전 시키거나 Qt 프레임 워크 자체를 구축하는 데 사용하지는 않을 것입니다.
C++ API 향상
C++ 은 지난 몇 년 동안 많은 변화를 겪었습니다. 우리는 Qt 5.0을 C++ 98 에 기반을 두어야했지만 이제 Qt 6을 위해 C++ 17 에 의존할 수 있습니다. 이는 C ++ 이 Qt 5를 수행 할 때 사용할 수 없었던 많은 기능을 제공한다는 것을 의미합니다. Qt 6의 목표는 이전 버전과의 호환성을 유지하면서이 기능과 더 잘 통합하는 것입니다.
Qt 6 의 경우 QML 및 Qt Quick에 도입된 기능 중 일부를 C++ 에서 사용할 수 있도록하는 것이 목표입니다. 우리는 QObject 및 관련 클래스에 대한 새로운 속성 시스템을 도입하고 QML 의 바인딩 엔진을 Qt의 핵심에 통합하여 C++ 에서 사용할 수 있도록 합니다. 새로운 속성 시스템과 바인딩 엔진은 바인딩에 대한 런타임 오버헤드 및 메모리 소비를 크게 줄이고 Qt Quick뿐만 아니라 Qt의 모든 부분에서 액세스 할 수 있게 합니다.
언어 지원
Qt 5.12 에서는 Python 지원이 도입되었으며 WebAssembly 용 Qt 를 통해 브라우저를 새로운 플랫폼으로 추가했습니다. 크로스 플랫폼 포커스를 유지하고 확장하는 것은 6.0이 출시된 후 Qt 6 시리즈의 중요한 부분이 될 것입니다.
Qt 5와의 호환성 및 점진적 개선
이전 버전과의 호환성은 매우 중요하며 Qt 6을 개발할 때 주요 요구사항입니다. 프레임워크를 사용하여 작성된 수십억 줄의 코드가 있고 해당 코드가 호환되지 않는 경우 사용자 비용이 발생합니다. 또한 Qt 6으로의 변경 작업이 사용자에게 더 많은 작업을 요구할수록, Qt 6의 채택 속도가 느려져 Qt 5의 마지막 버전을 유지하는 데 더 많은 비용이 소요됩니다.
따라서 사용자 코드베이스에서 컴파일 타임 또는 런타임 오류를 유발하는 방식으로 Qt를 중단하지 않아야 합니다. 호환성을 중단해야 하는 경우 런타임시 자동 중단보다 컴파일 타임 오류(compile-time error)가 선호됩니다. (감지하기가 훨씬 더 어렵습니다).
더 이상 사용되지 않는 Qt 부분을 제거해야 하지만 사용자에게 필요한 기능이 있는지 확인해야 합니다. 즉, Qt 위젯 및 많은 사용자가 사용하는 기타 부품과 같은 주요 기능은 물론 계속 사용할 수 있습니다.
우리는 Qt 5 시리즈에서 할 수 없었던 핵심 클래스 및 기능에 대한 많은 점진적 개선을 계획하고 있습니다. 전체 소스 호환성을 유지하는 것이 목표이지만 Qt 6과의 이진 호환성(binary compatibility)을 깨뜨릴 수 있기 때문에 Qt 5에서는 불가능했던 많은 정리 및 개선 작업을 수행할 수 있습니다.
그럼에도 불구하고 우리는 앞으로 나아가야 하며 Qt 6에서는 일부 집 청소(house cleaning)가 필요합니다. 우리는 Qt 5에서 더 이상 사용되지 않는 대부분의 기능(함수, 클래스 또는 모듈)을 제거합니다.이 집 청소는 개발자의 시간을 절약 해줍니다. 장기적으로 유지 관리되고 현재 코드베이스에 더 집중할 수 있습니다.
그러나 더 이상 사용되지 않는 부품에서 이식하는 것은 가능한 한 간단해야 하며 사용자는 Qt 5.15 LTS를 사용하여 점진적으로 이 작업을 수행 할 수 있습니다. 우리의 목표는 Qt 6이 Qt 5.15 LTS와 충분히 호환되므로 동시에 두 버전에 대해 컴파일 할 수있는 큰 코드 기반을 쉽게 유지할 수 있다는 것입니다.
시장 및 기술 제품 구조
Qt 프레임워크 및 도구를 개선하는 것 외에도 컴포넌트 및 개발 도구를 위한 새로운 시장을 창출하는 것을 목표로 합니다. 시장은 소비자를 대상으로 하지 않고 애플리케이션과 임베디드 장치를 개발하고 설계하는 직접 사용자에게 초점을 맞출 것입니다. 따라서 Qt 생태계의 중심 집결 지점이 될 것입니다. 또한 타사에 Qt에 추가한 내용을 게시 할 수 있는 공간을 제공하여 무료 및 유료 콘텐츠를 모두 허용합니다.
Qt는 지난 몇 년 동안 새로운 버전을 제공하는 것이 주요 과제가 될 정도로 많이 성장했습니다. Qt 6을 사용하면 제품 오퍼링을 재구성하고 필수 프레임 워크 및 툴링을 포함하는 더 작은 코어 제품을 가질 수 있습니다. 우리는 마켓 플레이스를 사용하여 핵심 Qt 제품과 긴밀하게 결합된 번들이 아닌 애드온 프레임 워크 및 도구를 제공할 것입니다. 이를 통해 제공시기와 방법에 대한 추가 유연성을 제공하고 일부 애드온의 출시 일정을 분리 할 수 있습니다.
의견을 보내주십시오.
기술 비전은 Qt 6의 첫 번째 릴리스까지 계속 발전할 것입니다.이 문서는 다음 버전의 Qt에서 가장 중요한 많은 부분을 담고 있다고 믿지만 아직 완전하지는 않습니다. 더 많은 아이디어가 있다면 Qt 6의 개발 및 Qt의 개방형 거버넌스 모델을 통해 관련 토론에 참여하십시오.
Qt 6.0은 아직 2년 중 더 나은 기간으로 마감되지는 않았지만, Qt 6을 위해 계획된 초기 패치는 Git 준비 단계에서 시작될 것으로 예상됩니다.
Lars Knoll(Qt Company CTO)은 오늘 초기 단계인 Qt6 개발의 대부분이 시작될 예정이므로 Qtbase에 대한 Qt 브랜치(branch) 시작 계획을 발표했습니다. 이미 그는 동료 개발자로부터 패치들을 수집하고 있으며, 적어도 이 브랜치를 보유하고 있으면 Qt 6.0 개발이 실제로 가열될 때까지 준비를 위한 기초가 될 것입니다.
현재 Qt5 dev 코드는 Qt6 code-base로 정기적으로 병합됩니다. Qt6 에서 제거 예정인 함수는 먼저 Qt5 코드에서 사용되지 않는 것으로 표시되어야 하며, 바이너리 호환성 파손은 시작될 수도 있습니다.
가장 최근의 Qt 6 계획은 2020년 11월에 릴리즈될 예정입니다. Qt 5.15 LTS는 Qt5의 마지막 라인이 될 것으로 예상됩니다.
Qt6은 아마도 C++ 17 기반으로 정착될 것이고, CMake를 선호하는 빌드 시스템으로 (원래 Qbs에 투자한 이후지만) 집중하고 있으며, 이 초기 6.0 릴리즈는 입을 떡벌리게 만들 새 특징들과는 대조적으로 restructuring / deprecating / cleaning 에 집중합니다. 그들의 목표는 Qt5에서 Qt6로의 전환이 개발자와 최종 사용자 모두에게 원활하도록 하는 것입니다.
Qt 개발자 메일링 리스트 아카이브가 broken 되어 있는 상태에서, Lars가 Qt6 Git 분기 계획에 대해 말해야 했던 메시지는 다음과 같습니다.
저는 qtbase에서 Qt 6을 위한 브랜치를 생성하겠습니다. 다른 사람들은 꽤 많은 패치를 모으기 시작했고 이제는 그 패치들이 한 곳에 있어야합니다.
지금은 Qtbase로 제한하고 싶습니다. Qt 6 관련 작업이 거의 이루어지기 때문에, Qt 6 관련 작업을 위해 다른 모듈을 준비하기 위해 CI 측에서 몇 가지 작업을 수행해야합니다 (Frederik은 세부 정보를 게시합니다. 별도의 메일로).
브랜치는 Windows, macOS 및 Linux에서만 최신 컴파일러에 대해 컴파일 및 테스트를 수행하는 제한된 테스트를 수행할 수 있습니다.
현재 다음 규칙이 'qt6' 브랜치에 적용됩니다.
우리는 정기적으로 그것을 dev에 합병한다.
BC 손상은 문제가 없습니다.
SC의 중단은 유지 보수 자의 승인을 필요로 하며 이 변경 사항을 소스가 호환되지 않는 변경으로 표시하는 변경 로그 항목이 필요합니다.
8월 1일부터 Google Play는 64비트 버전이 없는 새로운 애플리케이션이나 애플리케이션 업데이트를 더 이상 허용하지 않습니다 (물론 소스 코드가 전혀 없는 경우는 제외). Qt 사용자의 경우 64 비트 바이너리가 포함된 추가 APK를 빌드해야 합니다.
Qt는 5.12.0 이후 Qt는 Android 용 64 비트 바이너리를 출시했으므로 새로운 요구사항을 준수하는 것이 기술적으로 문제가 있지는 않습니다. 하지만 사용자와 논의한 후에 여러 사람이 한꺼번에 지원할 수 있는 앱을 Google Play에서 설정하는 방법에 대해 모든 사람이 정확히 알지 못합니다.
이러한 헬프 요청은 현재 새로운 Windows 워크스테이션을 설치하고 있다는 사실과 함께 일반적으로 Android 앱 개발을 위한 Qt를 볼 수 있는 절호의 기회였습니다. 이 블로그에서는 clean slate 로 시작하여 Android 에서 시작하는 방법과 Google Play 요구사항을 준수하는 앱을 게시하는 방법을 보여줍니다.
저는 다음과 같은 일들을 진행할 것 입니다:
작업 환경을 확보하는 데 필요한 설치 단계를 안내하고,
다중 아키텍처를 위한 애플리케이션 구축 프로세스를 설명하고,
바이너리를 Google Play에 업로드하는 방법을 보여 드리겠습니다.
처음 몇 부분은 많은 사람들에게 친숙할 수 있습니다. 따라서 지루하고 기본 주제에 대해 듣고 싶다면 4 단계로 건너 뛸 수 있습니다
SDK 버전에 대한 참고 사항
안드로이드 SDK는 그 자체로 무겁게 개발되고 있으며, 종종 하위 호환이 안되기 때문에 Qt 와의 통합에 문제가 있습니다. SDK 의 변경 또는 회귀로 인해 발생하는 Qt의 비 호환성 문제에 대해 최대한 신속하게 대처할 수 있지만 일반적으로 경험할 수 있는 가장 좋은 버전의 Android 도구로 업그레이드하기 전에 기다려야합니다.
다른 플랫폼에도 몇 가지 문제가 있지만 우리가 보았던 대부분의 문제는 Windows 에서 발생했습니다. 따라서 윈도우즈를 호스트 시스템으로 사용한다면 환경을 설정하기 전에 알려진 좋은 버전이 있는지 확인하십시오.
현재 Qt 5.13.0과 함께 다음 도구의 사용을 권장합니다 :
Android 빌드 도구 버전 28
Android NDK r19
Java Development Kit 8
몇 가지 문제가 발생하면 알려진 문제 페이지 를 확인하여 업데이트 된 정보가 있는지 확인하십시오.
이제 모든 것을 올바른 버전으로 가져 오는 방법과 장소에 대한 세부 정보를 얻으십시오.
1 단계 : JDK 설치
안드로이드는 기본적으로 Java 기반 플랫폼이며 Qt 애플리케이션을 C++ 및 QML 로 작성할 수는 있지만 통합을 가능하게 하는 파일을 컴파일하려면 Java Development Kit 이 필요합니다.
Android SDK 관리자 도구(Manager tool)와 최신 버전의 Oracle JDK 간에는 호환이 잘 안되므로, Android 환경과 함께 최신 JDK 버전는 함께 사용할 수 없습니다. 이 문제를 해결하려면 Android 용 JDK 버전 8 을 다운로드하는 것이 좋습니다.
오라클의 공식 바이너리 또는 AdoptOpenJDK 프로젝트와 같은 대안을 사용할 수 있습니다.
설치 프로그램을 다운로드하여 실행하고 기본 위치에 설치하십시오.
2 단계 : Android 환경 설정
두 번째 단계는 실제 Android 개발 환경을 얻는 것입니다. Android Studio 를 다운로드하고 설치하면 됩니다. 다른 “beta” 및 “canary” 릴리스를 스크롤하면 최신 안정 릴리스가 제공됩니다.
Android Studio가 설치되면 이 도구를 사용하여 'SDK 플랫폼'을 설치할 수 있습니다. 이것은 특정 안드로이드 배포판을 위한 실제 Java 클래스 모음입니다. Android Studio 를 처음 시작하면 SDK 플랫폼을 설치하라는 메시지가 표시됩니다. 권장되는 기본값 인 SDK 29 의 최신 버전을 안전하게 사용할 수 있습니다.
SDK 외에도 NDK 도 설치해야합니다. 이것은 C++ 코드를 크로스 컴파일하여 Android 에서 실행하는 데 사용되는 개발 키트입니다. 위에서 언급했듯이 Android NDK r20 은 컴파일 오류를 일으키는 문제가 있으므로 최신 릴리스가 아닌 Android NDK r19c 를 사용합니다. 이 문제는 Qt 5.13.1 및 Qt 5.12.5에서 해결될 예정이므로 이를 사용하기 시작하면 Android NDK r20 으로 업그레이드 할 수 있습니다.
그리고 마지막 단계로 최신 버전이 아닌 Android 빌드 도구의 버전 28.0.3 을 사용하고 있는지 확인해야 합니다. 이 문제는 Windows 호스트에서만 발생합니다.
Android Studio의 시작 대화 상자에서 구성을 클릭한 다음 SDK 관리자 를 선택하십시오. SDK 도구 탭으로 이동하여 패키지 정보 표시가 선택되어 있는지 확인하십시오. Android 빌드 도구 에서 29.0.0 을 선택 취소하고 28.0.3 을 선택합니다.
그러면 작동하지 않는 버전의 빌드 도구가 설치 제거되고 이전 버전이 설치됩니다. Apply 을 클릭하여 프로세스를 시작하면 프로세스가 완료되면 작동하는 Android 환경이 설치됩니다.
3 단계 : Qt 설치
이 가이드에서는 Qt 5.13.0을 사용하게 될 것입니다. 아직 시작하지 않았다면 Qt 계정 에서 온라인 설치 프로그램을 다운로드하십시오.
설치 프로그램을 실행할 때 arm64-v8a 및 armv7a 대상 아키텍처를 선택해야 합니다. 이것은 각각 Android 디바이스에서 가장 일반적으로 사용되는 프로세서 인 ARM 계열 프로세서의 64 비트 및 32 비트 버전에 대한 기술 이름입니다.
참고 : 이 예제에서는 특히 데모로 사용할 응용 프로그램이 포함되어 있으므로 Qt Purchasing 도 필요합니다. 같은 목록에서 선택할 수도 있습니다.
Qt 설치가 끝나면 Qt Creator 를 시작하고 Options 을 엽니다. 장치 아래에서 Android 탭을 선택하고 이전 단계에서 다른 패키지를 설치한 디렉토리를 선택하십시오.
모든 것이 올바르게 설정되면 Qt Creator 에 녹색 체크 표시가 나타나고 Qt 로 안드로이드 개발을 할 준비가 됩니다.
4 단계 : Qt Creator에서 프로젝트 설정하기
이 예제에서는 Qt Hangman 예제를 사용합니다. 이는 크로스 플랫폼 방식으로 인앱 구매를 구현하는 방법을 보여주기 위해 만든 작은 예입니다.
먼저 Qt Creator에서 예제를 엽니다. 시작 화면에서 수행할 수 있습니다. Qt Creator 가 열리면 Qt Creator가 이를 구축하기 위해 사용할 Qt 버전을 선택하도록 요청할 것입니다.
Qt의 64 비트와 32 비트 버전을 모두 선택하고 Configure Project를 클릭하십시오.
Google Play의 추가 요구사항을 준수하기 위해 32 비트 장치용 및 64 비트 장치용의 두 가지 APK 패키지를 만들고자 합니다. 우리는 이들 각각을 개별적으로 구성해야 합니다.
이 스크린 샷은 32 비트 빌드의 설정 예를 보여줍니다.
여기서 주목해야 할 중요한 사항은 다음과 같습니다:
각 빌드마다 다른 섀도우 빌드 디렉토리를 사용하십시오.
릴리스 구성을 선택했는지 확인하십시오.
또한 패키지 서명 확인란을 선택하여 패키지에 서명해야 합니다. 그렇지 않으면 Google Play 스토어에서 패키지를 거부합니다.
빌드 디렉토리를 제외하고는 64 비트 빌드의 설정이 동일해야 합니다. 왼쪽에 있는 64 비트 키트를 선택하고 거기에서 동일한 조정을 하십시오.
5 단계 : manifest 준비
또한 두 패키지는 하나의 세부 사항을 제외하고는 동일한 AndroidManifest.xml 파일이 필요합니다.
두 버전의 버전 코드(version code)가 달라야 합니다.
버전 코드는 APK가 스토어의 기기에 설치될 때 버전 코드가 가장 높은 APK를 선택한다는 점을 명심하는 한 선택할 수 있는 거의 모든 항목이 될 수 있습니다.
Qt 사용자 Fabien Chéreau가 버그 보고서에서 언급한 바에 따르면, 일반적으로 64 비트 버전의 버전 코드를 32 비트 버전보다 높게 설정하게 하게 하느 것이 좋습니다. 그래서 두 버전을 모두 지원하는 장치가 64 비트 버전을 더 선호하도록 구성합니다.
Felix Barz가 같은 맥락에서 지적했듯이 프로젝트의 .pro 파일에서 이 작업을 자동화할 수 있습니다. 다음은 코드를 약간 수정한 것입니다.
defineReplace(droidVersionCode) {
segments = $$split(1, ".")
for (segment, segments): vCode = "$$first(vCode)$$format_number($$segment, width=3 zeropad)"
contains(ANDROID_TARGET_ARCH, arm64-v8a):\
suffix = 1else:contains(ANDROID_TARGET_ARCH, armeabi-v7a):\
suffix = 0
# add more cases as needed
return($$first(vCode)$$first(suffix))
}
VERSION = 1.2.3
ANDROID_VERSION_NAME = $$VERSION
ANDROID_VERSION_CODE = $$droidVersionCode($$ANDROID_VERSION_NAME)
이 깔끔한 트릭(감사합니다, Felix!)은 응용 프로그램의 VERSION 을 정수로 변환하고 최하위 끝에 새로운 숫자를 추가하여 아키텍처를 나타냅니다. 예를 들어 버전 1.2.3의 경우, 버전 코드는 32 비트 패키지의 경우 0010020031 이고, 64 비트 패키지의 경우 0010020031 입니다.
프로젝트 설정에서 APK 빌드 아래의 버튼을 사용하여 AndroidManifest.xml 을 생성하면 이 버전 코드가 프로젝트에서 자동으로 선택됩니다. 이 작업을 완료하고 매니페스트를 편집하여 응용 프로그램의 패키지 이름과 제목을 얻으려면 패키지를 빌드해야 합니다. 먼저 두 키트 중 하나를 사용하여 빌드를 수행한 다음 다른 키트를 활성화하고 다시 빌드하십시오.
완료되면 두 개의 릴리스 가능한 APK 패키지(이전에 설정한 각 빌드 디렉토리에 하나씩)가 제공됩니다. 빌드 디렉토리와 관련하여 패키지는 android-build\build\outputs\apk\release 있습니다.
보다 효율적인 설정을 위해서는이 프로세스를 자동화하는 것이 좋습니다. Qt Creator에서 사용하는 모든 도구를 명령 줄에서 실행할 수 있기 때문에 이것은 또한 가능합니다. 자세한 정보는 androiddeployqt 문서 를보십시오.
6 단계 : Google Play에 애플리케이션 게시
Google Play 퍼블리싱 페이지(publishing page)는 자체적으로 문서화가 되어 있으며 이를 수행하는 방법에 대한 많은 훌륭한 가이드가 있으므로 양식을 작성하는 모든 단계를 수행하지 않겠습니다.
일반적으로 요청하는 모든 정보를 입력하고 필요한 이미지를 제공하며 왼쪽 사이드 바에있는 모든 체크 표시가 녹색인지 확인하십시오.
여기에 모든 종류의 컨텐츠를 추가 할 수 있으므로 시간을 투자하십시오. 결국에는 앱의 인기도에 영향을 미칩니다.
일단 완료되면 App Releases 에서 새 릴리스를 만들고 APK를 업로드 할 수 있습니다.
한 가지 유의할 점은 처음 Google Play에서 앱 서명 키를 관리하도록 허용할지 여부를 묻는 메시지가 표시됩니다.
지금은 이것을 선택 해제해야 합니다. 이 기능을 사용하려면 응용 프로그램이 새로운 "Android App Bundle" 형식이어야 합니다. 아직 Qt 에서 지원하지는 않지만 이를 지원하기 위해 노력하고 있습니다. 사실, KDAB의 Bogdan Vatra (Qt의 안드로이드 포트의 관리자이기도 함)는 이미 그러한 지원을 얻는데 있어 가장 큰 문제를 해결하는 패치 를 게시했습니다.
우리가 지원을 받으면 릴리즈 프로세스가 좀 더 편리해질 것입니다. AAB 형식을 사용하면 Google Play 에서 다양한 아키텍처를 위한 최적화된 APK를 생성하지만 지금은 이 자습서에서 설명한대로 여러 키트를 설정하고 여러 APK를 구축하여 수동으로 이 작업을 수행해야 합니다.
두 개의 APK가 릴리스로 업로드되면 다음과 같은 목록이 표시됩니다. 두 개의 개별 APK 패키지는 각각 단일 기본 플랫폼을 포함합니다. 각 항목을 확장하면 "차별화 APK 세부 정보"가 무엇인지 알 수 있습니다. 기기가 Google Play 스토어에서 APK를 다운로드 할 때 다른 기기를 선택하는데 사용되는 기준입니다. 이 경우 차별화된 세부 사항이 기본 플랫폼이어야합니다.
32 비트 및 64 비트 바이너리 모두를 사용하여 Google Play에서 Qt 애플리케이션을 생성하고 출시 할 수 있습니다. APK가 업로드되면 게시(Publish)를 클릭하고 Google Play에서 자동화된 마술을 기다릴 수 있습니다. 현재 매장에 32 비트 앱이 있는 경우 2021년 8월 이전에 64 비트 버전으로 업데이트 해야 합니다. 비 호환 앱이 더 이상 64 비트 버전으로 제공되지 않게됩 니다. 심지어 32 비트 바이너리를 지원하더라도.
하지만 그런 경우 사용자 계정의 권한 상승이 필요합니다. 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;
}