https://softworld.tistory.com/61 - C

 

https://github.com/gabime/spdlog - C++

 

https://woochan-dev.tistory.com/9 - android

 

https://yhzion.tistory.com/10 - java

https://nowonbun.tistory.com/568 - java

 

https://python-guide-kr.readthedocs.io/ko/latest/writing/logging.htm - python

 

 

'프로그래밍 > 라이브러리' 카테고리의 다른 글

[PyQt] QMainWindow에서 QMenu 꺼내기  (0) 2020.05.08
[PyQt] ui 추출  (0) 2020.05.06
[PyQt] 시그널 블럭  (0) 2020.05.04
[PyQt] addLayout() / setLayout() 쓰임  (0) 2020.04.16
[PyQt] datime형과 QDate 간의 변환  (0) 2020.04.15

메뉴 선택에 따라 버튼이나 다른 메뉴가 enable/disable 되도록 만들고자 했다.

 

메뉴로 사용된 QAction 의 인스턴스에서 setEnabled() 메소드를 호출해주면 되는데

이 인스턴스를 끄집어 낼 수가 없었다.

 

추가한 역순으로 QMainWindow에서 menuBar() 메소드로 QMenuBar 객체를

끄집어 내고, 여기서 QMenu 객체를 끄집어 내면 될듯 했는데...

QMenuBar 객체에서 QMenu 객체를 꺼낼 수가 없었다.

당연히 QAction 객체도 끄집어 낼 수 없다.

 

어쩔수 없이 추가할 때ㅐ 잘 보관했다가 쓰는 수 밖에..

따라서 QMenu 객체와 QAction 객체는 클래스 전역으로 선언해야했다.

 

 

QMenu에서 actionAt() 함수를 사용하면 QAction은 꺼낼 수 있는 것 같았는데

actionAt() 메소드의 인자가 QPoint 형이다.  어쩌란건지... ㅡㅡ;

 

 

그냥 이놈이건 저놈이건 잘 보관하도록 하자..

 

 

 

'프로그래밍 > 라이브러리' 카테고리의 다른 글

로깅 라이브러리  (0) 2021.12.06
[PyQt] ui 추출  (0) 2020.05.06
[PyQt] 시그널 블럭  (0) 2020.05.04
[PyQt] addLayout() / setLayout() 쓰임  (0) 2020.04.16
[PyQt] datime형과 QDate 간의 변환  (0) 2020.04.15

레이아웃에 ui를 추가하기 위해 사용하는 메소드

addWidget() / addLayout() / addSpacing() / addStretch() / addSpacerItem()



레이아웃에 추가된 ui를 가져오는 메소드

widget() / layout() / spacing() / stretch() / spacerItem()


이들 중 widget() / layout() 메소드는 itemAt(idx) 로 레이아웃으로부터 layoutitem을 먼저 추출한 후
추출된 아이템에서 호출해야한다. (idx는 add된 순서이다.)



takeAt(idx) 메소드는 레이아웃에 추가된 ui를 리턴한 후 삭제한다. 

 

 

buttonH = QPushButton("1번 버튼")
button2 = QPushButton("2번 버튼")
button3 = QPushButton("3번 버튼")

hbox = QHBoxLayout()
hbox.addWidget(buttonH)

vbox = QVBoxLayout()
vbox.addLayout(hbox)
vbox.addWidget(button2)
vbox.addSpacing(5)
vbox.addSpacerItem(QSpacerItem(20, 48, QSizePolicy.Minimum, QSizePolicy.Expanding))
vbox.addStretch(5)
vbox.addWidget(button3)

self.setLayout(vbox)

testlog.debug("---------------------------------------------------------")

new_vbox = self.layout()            # self의 layout
testlog.debug("vbox.count(): %d" % vbox.count())

new_hbox = new_vbox.layout()            # vbox 자체의 layout이 추출된다.
testlog.debug("type(hbox): %s" % (type(hbox)))

item = {}

for idx in range(new_vbox.count()):
    item[idx] = new_vbox.itemAt(idx)
    testlog.debug("type(item[%d]): %s" % (idx, type(item[idx])))

new_hbox = item[0].layout()
new_button1 = item[1].widget()
spacer1 = item[2].widget()
spacer2 = item[3].widget()
spacer3 = item[4].widget()
new_button2 = item[1].widget()

testlog.info("new_button1.text(): %s, new_button2.text(): %s" % (new_button1.text(), new_button2.text()))

 

출력 내용은...

[2020-05-06 15:55:54,596][DEBUG|TestMain.py:352] ---------------------------------------------------------
[2020-05-06 15:55:54,597][DEBUG|TestMain.py:355] vbox.count(): 6
[2020-05-06 15:55:54,597][DEBUG|TestMain.py:358] type(hbox): <class 'PyQt5.QtWidgets.QHBoxLayout'>
[2020-05-06 15:55:54,597][DEBUG|TestMain.py:364] type(item[0]): <class 'PyQt5.QtWidgets.QHBoxLayout'>
[2020-05-06 15:55:54,597][DEBUG|TestMain.py:364] type(item[1]): <class 'PyQt5.QtWidgets.QWidgetItem'>
[2020-05-06 15:55:54,598][DEBUG|TestMain.py:364] type(item[2]): <class 'PyQt5.QtWidgets.QSpacerItem'>
[2020-05-06 15:55:54,598][DEBUG|TestMain.py:364] type(item[3]): <class 'PyQt5.QtWidgets.QSpacerItem'>
[2020-05-06 15:55:54,599][DEBUG|TestMain.py:364] type(item[4]): <class 'PyQt5.QtWidgets.QSpacerItem'>
[2020-05-06 15:55:54,609][DEBUG|TestMain.py:364] type(item[5]): <class 'PyQt5.QtWidgets.QWidgetItem'>
[2020-05-06 15:55:54,610][INFO|TestMain.py:373] new_button1.text(): 2번 버튼, new_button2.text(): 2번 버튼

 

'프로그래밍 > 라이브러리' 카테고리의 다른 글

로깅 라이브러리  (0) 2021.12.06
[PyQt] QMainWindow에서 QMenu 꺼내기  (0) 2020.05.08
[PyQt] 시그널 블럭  (0) 2020.05.04
[PyQt] addLayout() / setLayout() 쓰임  (0) 2020.04.16
[PyQt] datime형과 QDate 간의 변환  (0) 2020.04.15

ListWidget을 상속받은 클래스에 checkbox를 포함한 item을 넣었는데
checkbox의 체크 여부에 따라 item 텍스트의 색깔을 변경 시키고 싶었다


setStyleSheet를 쓰고 싶었으나 ListWidgetItem이 이 메소드를 지원하지 않았다.

listwidget의 stylesheet를 활용하는 방법을 찾을 수 있었는데 잘 동작하지 않았다. checkbox 가 변경된 하나의 item의 색상만 변경하고 싶었지만 아무 checkbox나 변경될 때 마다 모든 item의 색상이 변경 되었다.


item에 변화가 있을 경우 발생하는 itemChanged 시그널을 처리하는 슬롯을 만들어 그 안에서 setForeground() 메소드로 텍스트의 색깔을 바꾸었다.

동작은 잘 했지만 사소한 문제가 있었다.
이상하게 itemChanged 시그널을 두번 처리하는 것이다.
아마도 setForeground() 메소드 때문인듯 한데
희안하게 딱 두번만 발생한다. (무한 루프에 빠져야 정상 아닌가?)

어쨌건 해결하고 싶었다.


ListWidgetItem에서 checkbox가 변경되었을 때 발생되는 시그널이 무엇인지 알면 좋으련만 그거에 대한 내용은 qt 도큐먼트에도 없었다.

엇추 비슷한 내용을 찾다보니 시그널을 블럭 시킬수 있는 메소드가 있더라..

https://stackoverflow.com/questions/13771694/turn-off-pyqt-event-loop-while-editing-table


qobject로부터 상속받은 모든 클래스가 가지고 있다고 하니 listwidget에도 있으리라..


itemChanged 시그널을 처리하는 메소드에서 item을 변경하기 전에 blockSignals(True) 변경후에 blockSignals(False) 를 호출해주니 원하던 대로 동작한다!!!!!

안정성은 확인 못 했지만 원하던바대로 동작한다

'프로그래밍 > 라이브러리' 카테고리의 다른 글

[PyQt] QMainWindow에서 QMenu 꺼내기  (0) 2020.05.08
[PyQt] ui 추출  (0) 2020.05.06
[PyQt] addLayout() / setLayout() 쓰임  (0) 2020.04.16
[PyQt] datime형과 QDate 간의 변환  (0) 2020.04.15
[PyQt] 화면 크기 조정  (0) 2020.04.14

- container
QGroupBox() / QWidget() / QScrollArea() / QToolBox() / QTabWidget() / QStackedWidget() / QFrame() / QMdiArea() / QDockWIdget()
    setLayout()

    addWidget()



- layout
QBoxLayout() / QGridLayout() / QFormLayout()
    addLayout()
    addWidget()



for idx in range(self.layout().count()):
    item = self.layout().itemAt(idx).widget()
    item.setCheckState(Qt.Unchecked)


while not self.layout().isEmpty():
    item = self.layout().itemAt(0).widget()
    # item.setVisible(False)
    self.layout().removeWidget(item)
    del item


while not self.layout().count() > 0:
    child = self.layout().itemAt(0)
    item = child.widget()

    if item:
        item.deleteLater()

'프로그래밍 > 라이브러리' 카테고리의 다른 글

[PyQt] ui 추출  (0) 2020.05.06
[PyQt] 시그널 블럭  (0) 2020.05.04
[PyQt] datime형과 QDate 간의 변환  (0) 2020.04.15
[PyQt] 화면 크기 조정  (0) 2020.04.14
[PyQt] 이벤트핸들러, 슬롯  (0) 2014.12.09

+ Recent posts