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

Qt Maintenance Tool URL  (0) 2018.08.13
Ubuntu 18 Qt 설치 (컴포넌트는 일부만 설치)  (0) 2018.08.07
xlnt (6) Qxlnt 사용해 보기  (0) 2018.07.25
xlnt (5) msys2 에서 xlnt 빌드 하기  (0) 2018.03.28
void QObject::deleteLater()  (0) 2018.02.28
C++ 람다(lambda) 예제  (0) 2018.02.12


헬로우 큐트 포 파이썬 (Hello Qt for Python)


원문 http://blog.qt.io/blog/2018/05/04/hello-qt-for-python/

번역 https://j2doll.github.io/Qt-for-Python-Docs-Kor/


첫 번째 Qt for Python의 기술 프리뷰 릴리스가 여기 있습니다!

그래서 파이썬 세계에 문을 여는 방법에 대한 간단한 예제를 제공하고자 합니다.

일단 QWidgets을 사용하여 Python용 Qt의 단순성을 보여주는 간단한 애플리케이션을 작성해 보겠습니다.


모든 스크립트의 구조는 다음과 같습니다:

일단 QApplication을 생성합니다.

그리고 나서 모든 QWidgets과 사용하려는 구조체를 포함합니다. (예> QLabel 등)

어플리케이션을 보여 주면서 QApplication를 시작합니다. 이런 아이디어를 하나로 합치면 다음과 같이됩니다.

# hello_world.py
from PySide2.QtWidgets import QApplication, QLabel
 
app = QApplication([])
label = QLabel("Hello Qt for Python!")
label.show()
app.exec_()


이를 실행하기 위해 간단한 python hello_world.py가 작업을 수행합니다.

이때 진짜 질문은 다음과 같습니다: Qt 클래스(class)의 메소드(method)에 액세스하는 방법은 무엇인가?

프로세스를 단순화하기 위해 Qt API를 유지합니다. 예를 들어, QLabel의 크기(size)를 지정하려면 C++에서 다음과 같이 됩니다.

QLabel *label = new QLabel();
label->setText("Hello World!");
label->resize(800, 600);

Python에서 Qt를 사용하는 방법은 다음과 같습니다:

label = QLabel()
label.setText("Hello World!")
label.resize(800, 600)

이제 C++와 동등하게 적용하는 방법을 알게 되었으므로, 보다 정교한 응용 프로그램을 작성할 수 있습니다.

import sys
import random
from PySide2.QtCore import Qt
from PySide2.QtWidgets import (QApplication, QWidget,
    QPushButton, QLabel, QVBoxLayout)
 
 
class MyWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self)
 
        self.hello = ["Hallo welt!", "Ciao mondo!",
            "Hei maailma!", "Hola mundo!", "Hei verden!"]
 
        self.button = QPushButton("Click me!")
        self.text = QLabel("Hello World")
        self.text.setAlignment(Qt.AlignCenter)
 
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.text)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)
 
        self.button.clicked.connect(self.magic)
 
    def magic(self):
        self.text.setText(random.choice(self.hello))
 
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()
    sys.exit(app.exec_())

Qt 개발에 익숙하지 않다면, 특정 클래스를 확장하여 필요에 맞게 수정하는 것이 일반적입니다.

앞의 예제에서는 QWidget을 기본 클래스(base class)로 사용하고, QLabel과 QPushButton을 포함했습니다.


예제 응용 프로그램은 정말 간단합니다:

먼저 Hello World를 포함하는 목록을 다국어로 작성합니다.

그런 다음 QPushButton과 QLabel을 특정 정렬, 글꼴 및 크기로 초기화합니다.

그 다음, 우리는 객체를 포함하기 위해 QVBoxLayout을 생성하고 그것을 우리의 클래스에 할당합니다.

마지막으로 QPushButton의 clicked() 시그널(signal)을 magic이라는 메서드(method)에 연결합니다.

결과적으로 버튼을 누를 때마다 Hello World가 임의의 언어로 표시됩니다!


이 간단한 스크립트의 구조는 Qt for Python을 사용하는 대부분의 응용 프로그램의 기본이 될 것이므로, Qt for Python이 발표되자 마자 테스트해 보시기 바랍니다!

void QObject::deleteLater()

이 함수는 객체의 삭제를 예약합니다.
객체(object)의 제어가 이벤트 루프(event loop)로 반환되면 객체가 삭제됩니다.
이 함수가 호출될 때 이벤트 루프가 실행되고 있지 않으면, (예: QCoreApplication::exec() 전에 객체에서 deleteLater()가 호출되면,) 이벤트 루프가 시작될 때 객체가 삭제됩니다.
기본 이벤트 루프가 중지된 후 deleteLater()가 호출되면 객체가 삭제되지 않습니다.
Qt 4.8 이후로, 실행 중인 이벤트 루프가 없는 쓰레드(thread)에 있는 객체에서 deleteLater()가 호출되면, 쓰레드가 완료되면 객체가 삭제됩니다.
새 이벤트 루프를 시작하거나 종료하는 것은(예: 모달(Modal) 대화상자 열기) 지연된 삭제를 수행하지 않습니다. 삭제할 개체의 경우, 제어는 deleteLater()가 호출된 이벤트 루프로 돌아와야합니다.
참고: 이 함수를 두 번 이상 호출하는 것이 안전합니다. 첫번째 지연된 삭제 이벤트가 전달되면, 객체에 대한 보류 중 이벤트가 이벤트 큐(event queue)에서 제거됩니다.
세부 내용은 destroyed () 및 QPointer를 참조하십시오.



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

xlnt (6) Qxlnt 사용해 보기  (0) 2018.07.25
xlnt (5) msys2 에서 xlnt 빌드 하기  (0) 2018.03.28
void QObject::deleteLater()  (0) 2018.02.28
C++ 람다(lambda) 예제  (0) 2018.02.12
QObject Casting (qobject_cast)  (0) 2018.01.16
Gammaray binary for Qt 5.10/MingW(32bit)  (0) 2018.01.15

 Qt 는 QObject 를 부모 클래스로 하는 클래스를 생성하는 방법으로 메타 오브젝트 프로그래밍을 지원합니다. Qt 를 처음 사용하시는 분은 QObject의 구조나 사용 방법이 번잡하고 불필요한 것으로 느껴질 수도 있습니다. 하지만 Qt 를 제대로 사용하는 방법은 QObject 를 상속한 클래스를 만드는 것입니다. 물론 C++ 표준안(최근)의 방법만으로도 메타 오브젝트 프로그래밍은 가능합니다. 

 

 예제는 QObject 캐스팅(qobject_cast)을 활용하는 방법입니다. 이는 C++의 dynamic cast와 유사합니다. 부모 클래스가 누구인지를 기록하고 있으며, 조상들이 많은 경우 이 방법은 더욱 진가를 발휘합니다. 객체지향 프로그램에서 상속은 많은 단계를 하지 말라는 권장사항이 있습니다만, 이는 어떻게 만드는 가에 따라 권장이 아닐수 도 있다는 점은 명심하여야 합니다. 

 예제를 봅시다. 클래스 MyWidget 는 QWidget 을 부모 클래스로 상속합니다. 그리고 예제에 코드는 없지만 QWidget 는 QObject 를 상속하고 있습니다. 5번 라인을 보면 객체 포인터 obj 는 QWidget 포인터로 캐스팅하고 있습니다. dynamic cast 방식이 아닌 일반적인 C++ 캐스팅으로는 상속관계를 무시하고 캐스팅을 하므로 위험요소를 가지고 있습니다. 하지만 qobject_cast 를 사용하면 캐스팅시 점검을 수행하여 줍니다.

 예제 11번 라인을 보면 상속관계가 전혀 없는 QLabel 로 캐스팅하는 것을 볼 수 있습니다. 이런 경우 label 은 0의 값을 반환하고 이는 C++의 NULL과 동일값입니다. 물론 12번 라인의 assert()를 통하여 잘못된 캐스팅을 미리 알아낼 수 있습니다.

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

void QObject::deleteLater()  (0) 2018.02.28
C++ 람다(lambda) 예제  (0) 2018.02.12
QObject Casting (qobject_cast)  (0) 2018.01.16
Gammaray binary for Qt 5.10/MingW(32bit)  (0) 2018.01.15
GammaRay : Qt를 위한 Spy++  (0) 2018.01.10
Xlnt (4) 값 쓰기 예제  (0) 2017.10.15

Gammaray binary for Qt 5.10/MingW(32bit)

gammaray-2.8.1-bin-Qt5.10.0-MingW-x86.7z.001

gammaray-2.8.1-bin-Qt5.10.0-MingW-x86.7z.002

gammaray-2.8.1-bin-Qt5.10.0-MingW-x86.7z.003

gammaray-2.8.1-bin-Qt5.10.0-MingW-x86.7z.004

gammaray-2.8.1-bin-Qt5.10.0-MingW-x86.7z.005

gammaray-2.8.1-bin-Qt5.10.0-MingW-x86.7z.006

gammaray-2.8.1-bin-Qt5.10.0-MingW-x86.7z.007

gammaray-2.8.1-bin-Qt5.10.0-MingW-x86.7z.008



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

C++ 람다(lambda) 예제  (0) 2018.02.12
QObject Casting (qobject_cast)  (0) 2018.01.16
Gammaray binary for Qt 5.10/MingW(32bit)  (0) 2018.01.15
GammaRay : Qt를 위한 Spy++  (0) 2018.01.10
Xlnt (4) 값 쓰기 예제  (0) 2017.10.15
Xlnt (3) Vector를 이용한 예제  (0) 2017.10.15

+ Recent posts