코드 참고

 

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QMessageBox, QAction, QMenu, qApp
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtCore import *

class Exam(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.show()

app = QApplication(sys.argv)
w = Exam()
sys.exit(app.exec_())

# 버튼에 설정 가능한 것
btn = QPushButton('button name', self)
btn.resize(btn.sizeHint())
btn.setToolTip("툴팁임 <b>진하게도 가능하지</b>")
btn.mvoe(20,30) # 이동도 가능함

self.setGeometry(100,100,200,300) # 크기 조절 가능
self.setWindowTitle("제목 넣기도 가능")
self.show()

##

QCoreApplication # 이벤트 처리 담당
btn.clicked.connect(QCoreApplication.instance().quit) # 버튼 클릭 시 프로그램 종료
self.resize(500,500) # resize 만 해도 가운데 뜸
 
def closeEvent(self, QCloseEvent): # overriding 함
    ans = QMessageBox.question(self, "종료 확인", "종료할꺼야?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) # 마지막은 기본 값 위치 설정, 값을 받을 수 있음
    if ans == QMessageBox.Yes:
        QCloseEvent.accept()
    else:
        QCloseEvent.ignore()

# statusbar 만들기
self.statusBar()
self.statusBar().showMessage("안녕하세요")

# menu 만들기
menu = self.menuBar()
menu_file = menu.addMenu('File')
menu_edit = menu.addMenu('Edit')
menu_view = menu.addMenu('View')



file_new = QMenu('New', self)
new_txt = QAction('텍스트 파일', self)
new_py = QAction('파이썬 파일', self)
view_stat = QAction('상태표시줄', self, checkable=True) # 체커블 추가
view_stat.setCheckable(True)

file_exit = QAction('Exit', self)
file_exit.setShortcut('Ctrl+Q')
file_exit.setStatusTip('누르면 프로그램 종료됨')

file_exit.triggered.connect(QCoreApplication.instance().quit)
view_stat.triggered.connect(self.tglStat)

file_new.addAction(new_txt)
file_new.addAction(new_py)

menu_file.addMenu(file_new)
menu_file.addAction(file_exit)
menu_view.addAction(view_stat)

# 04강.

def tglStat(self, state):
    if state:
        self.statusBar().show()
    else:
        self.statusBar().hide()

# 우클릭 만들기. 재정의 함
def contextMenuEvent(self, QContextMenuEvent):
    cm = QMenu(self)

    quit = cm.addAction("Quit")

    action = cm.exec_(self.mapToGlobal(QContextMenuEvent.pos()))
    if action == quit:
        qApp.quit()  # connect 에 넣으려면 () 괄호를 빼야 함

# Layout

hbox = QHBoxLayout()
hbox.addStretch(1) # 다른 위젯이 차지하고 있지 않은 영역은 쭉쭉 늘려줌
hbox.addWidget(okButton)
hbox.addWidget(cancelButton)

# 계산기 모양으로 버튼 배치
grid = QGridLayout()
grid.setSpacing(10) # 개체들 사이사이에 공간을 주겠다
self.setLayout(grid)

positions = [(i,j) for i in range(5) for j in range(4)]
grid.addWidget(button, *position) # 이럴 경우에 postion 이 tuple 이면 쪼개서 넘어감. (1,3) -> 1,3

QLabel, QLineEdit, QTextEdit
grid.addWidget(review, 3,0)
grid.addWidget(reviewEdit, 3,1,5,1)

# event, signal
lcd = QLCDNumber(self)
sld = QSlider(Qt.Horizontal, self)

sld.valueChanged.connect(lcd.display) # dispaly 메서드는 미리 정의됨

## 키 누를 때 반응
def keyPressEvent(self, e): # e 는 값을 눌렀을 때 전달되는 키. 이벤트를 다시 정의하는 것. 틀 잡아놓은 것을 활용
    if e.key() == Qt.Key_Escape: # 정의된 상수랑 비교. e.key() 로 숫자화 된거 받음
        self.close() # 이게 제일 간단한 것

## 키 누르는 위치를 따라감
grid.addWidget(self.label, 0, 0, QtAlignTop)
self.setMouseTracking(True) # 마우스 위치를 계속 확인하겠다. CPU 소모함

def mouseMoveEvent(self,e):
    x = e.x()
    y = e.y()
    text = "x:{0}, y:{1}".format(x,y)
    self.label.setText(text)

##
btn1.clicked.connect(self.buttonClicked)

def buttonClicked(self):
    sender = self.sender() # sender() 는 함수를 호출한 객체를 소환함
    self.statusBar().showMessage(sender.text() + ' was pressed')

## mouse event 확인. emit() -> connect() -> signal() -> action!
class Communicate(QObject):
    closeApp = pyqtSignal() # pyqtSignal 을 사용하기 위해 QObject 를 상속함

self.c = Communicate()
self.c.closeApp.connect(self.close)

def mousePressEvent(self, event):
    self.c.closeApp.emit()

# dialog, 대화상자
self.btn.clicked.connect(self.showDialog)
def shwoDialog(self):
    text, ok = QInputDialog.getText(self, 'Input Dialog', 'Enter your name')
    if ok:
        self.le.setText(str(text)) # string 으로 바꾸기 위해 str 사용함

## frame 에 color 넣기
col = QColor(0,0,0)
self.frm = QFrame(self)
self.frm.setStyleSheet('QWidget { background-color: %s }' % col.name())
self.frm.setGeometry(100,200,150, 250)
def showDialog(self):
    col = QColorDialog.getColor()
    if col.isValid():
        self.frm.setStyleSheet("QWidget { background-color: %s }" % col.name())

## font 수정하기
btn = QPushButton('Dialog', self)
bt.setSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed) # 뭔가를 고정한다는 의미
def showDialog(self):
    font, ok = QFontDialog.getFont()
    if ok:
        self.lbl.setFont(font)

# checkbox
cb = QCheckBox('show title', self)
cb.toggle()
cb.stateChanged.connect(self.changeTitle)
def changTitle(self, state): # state 관련 메서드라 state 를 받을 수 있도록 던져주나 봄
    if state == Qt.Checked:
        self.setWindowTitle('QCheckBox')
    else:
        self.setWindowTitle('.')

## btn 으로 color 적용 설정
redb.clicked.connect(self.setColor)
def setColor(self, pressed): # clicked 라서 click 여부를 던져주나봄. pressed 가 받음
    source = self.sender() # 부른 애를 할당함
    if pressed:
        val = 255
    else:
        val = 0
    if source.text() == "Red":
        self.col.setRed(val)
    elif source.text() == "Green":
        self.col.setGreen(val)
    else:
        self.col.setBlue(val)
    self.square.setStyleSheet("QFram { background-color : %s }" % self.col.name())

## progress bar 활용
self.pbar = QProgressBar(self)
self.btn = QPushButton('Start', self)
self.btn.clicked.connect(self.doAction)
self.timer = QBasicTimer()
self.step = 0

def timerEvent(self, e):
    if self.step >= 100:
        self.timer.stop()
        self.btn.setText('Finished')
        return
    self.step = self.setp+1
    self.pbar.setValue(self.step)

def doAction(self):
    if self.timer.isActive():
        self.timer.stop()
        self.btn.setText('Start')
    else:
        self.timer.start(100,self) # 100/1000 초라서 0.1초를 나타냄
        self.btn.setText('Stop')

# image 넣기
pixmap = QPixmap('Gun.png')
lbl = QLabel(self)
lbl.setPixmap(pixmap)

## 글자 친거 넣거
self.lbl = QLabel(self)
qle = QLineEdit(self)
qle.textChanged[str].connect(self.onChanged)
def onChanged(self, text):
    self.lbl.setText(text)
    self.lbl.adjustSize()

## combobox
self.lbl = QLabel('Ubuntu', self)
combo = QComboBox(self)
combo.addItem("Ubuntu")
combo.addItem("Normal")
combo.activated[str].connect(self.onActivated)
def onActivated(self,text):
    self.lbl.setText(text)
    self.lbl.adjustSize()

## drag & drop - 어렵다 다시 이해해보자
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setAcceptDrops(True)

        self.button = Button('Button', self)
        self.button.move(100,65)

    def dragEnterEvent(self, e):
        e.accept()

    def dropEvent(self, e):
        position = e.pos()
        self.button.move(position)
        e.accept() # accept 는 설정해줘야 함

class Button(QPushButton):
    def __init__(self, title, parent):
        super().__init__(title, parent)
    def mouseMoveEvent(self,e): # mouseMoveEvent
        if e.buttons() != Qt.RightButton:
            return
        mimeData = QMimeData()
        drag = QDrag(self)
        drag.setMimeData(mimeData)
        drag.exec_(Qt.MoveAction)
    def mousePressEvent(self,e): # mousePressEvent
        super().mousePressEvent(e)
        if e.button() == Qt.LeftButton:
            print('press')

# painter #skip

# tablewidget
self.btn.clicked.connect(on_cl)

def on_cl(): # 요건 버튼 클릭 시 실행. 함수임!
    fp = open("out.txt","wb")
    for r in range(ex.size):
        for c in range(ex.size):
            pickle.dump(ex.table.item(r,c).text(), fp)
    fp.close()

def createTable(self): # 이건 init 할 때 미리 부르는 거임. 메서드임!
    self.table = QTableWidget()
    self.table.setRowCount(self.size)
    self.table.setColumnCount(self.size)
    self.setHorizontalHeaderLabels(("이름","국어","영어","수학"))
    try:
        fp = open("out.txt","rb")
        for r in range(self.size):
            for c in range(self.size):
                self.table.setItem(r,c,QTableWidgetItem(str(pickle.load(fp))))
        fp.close()
    except:
        for r in range(self.size):
            for c in range(self.size):
                self.tabel.setItem(r,c,QTableWidgetItem(""))

# gray scale, open file
## 값을 넣으면 버튼이 생성
self.btn.clicked.connect(self.createBtn)
def createBtn(self):
    self.cnt = int(self.txt.text())
    for i in range(self.cnt):
        self.btnList.append(QPushButton(str(i+1) + "번째 버튼", self))
        self.btnList[i].resize(QSize(80,25))
        self.btnList[i].move(10,self.btnTop + (i*25))
        self.btnList[i].show() # 이게 중요함. show 를 해야 버튼을 보여줌

# 이미지 반사
# 타임벨

 

참고 : https://www.youtube.com/watch?v=OtqWefBqbxA&list=PL1eLKSeW1Baj72go6l3gg4C8TXRNUBdMo

+ Recent posts