본문 바로가기
Programming/PyQt

[Project]학점계산기 : 위젯 기능에 대하여

by owllight 2014. 12. 29.

Qt에서 구상한 파일을 python으로 변환한 뒤에 본격적인 코딩을 시작합니다!

제일 먼저 위젯들의 크기 및 위치와 기본적인 모양을 설정하는 코드들이 보입니다. 각 기능은 다음 주석과 같습니다.

class Ui_load(object):
    def setupUi(self, load):
        load.resize(217, 157)
        load.setMinimumSize(QtCore.QSize(217, 157))                    #위젯 창의 최소 크기를 설정합니다
        load.setMaximumSize(QtCore.QSize(217, 157))                   #위젯 창의 최대 크기를 설정합니다
        load.setWindowIcon(QtGui.QIcon("english_ime-128.ico"))     #위젯의 윈도우 창에 있는 아이콘을 설정합니다
        self.lineEdit = QtGui.QLineEdit(load)                                #LineEdit을 불러옵니다
        self.lineEdit.setGeometry(QtCore.QRect(80, 20, 113, 20))       #LineEdit의 크기와 위치를 설정합니다        
        self.lineEdit.setMaxLength(8)                                          #최대 입력할 수 있는 텍스트 길이를 설정합니다
        self.lineEdit2 = QtGui.QLineEdit(load)
        self.lineEdit2.setGeometry(QtCore.QRect(80, 50, 113, 20))
        self.lineEdit2.setMaxLength(4)
        self.label_4 = QtGui.QLabel(load)
        self.label_4.setGeometry(QtCore.QRect(20, 20, 51, 20))
        self.label_4.setAlignment(QtCore.Qt.AlignCenter)            #Label의 글자를 중간으로 배열합니다
        self.label_6 = QtGui.QLabel(load)
        self.label_6.setGeometry(QtCore.QRect(20, 50, 51, 20))
        self.label_6.setAlignment(QtCore.Qt.AlignCenter)
        self.pushButton = QtGui.QPushButton(load)
        self.pushButton.setGeometry(QtCore.QRect(130, 120, 75, 23))
        self.label_5 = QtGui.QLabel(load)
        self.label_5.setGeometry(QtCore.QRect(10, 80, 201, 30)) 

Qt를 Python으로 변환한 것이라 코드가 쓸데없이 중복된 것이 많을 것입니다. 그런 것은 지워서 수정하시면 됩니다:)

다음은 시그널과 슬롯에 대한 코드입니다.

        self.retranslateUi(load)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.start)
        QtCore.QMetaObject.connectSlotsByName(load)

    def retranslateUi(self, load):
        load.setWindowTitle("안녕하세요!")
        self.label_4.setText("학번")
        self.label_6.setText("비밀번호")
        self.pushButton.setText( "시작하기")
        self.label_5.setText("※자신의 학번과 비밀번호 4자리를\n   입력해주십시오.")

    def start(self):
        global database
        num=self.lineEdit.text()
        pw=self.lineEdit2.text()
        c = mysql.connector.connect(user='root', password='apmsetup',host='000.000.000.000',database='semple')
        cursor = c.cursor()
        cursor.execute("select * from login where 학번=%s"%num)
        confirm = cursor.fetchone()

retranslateUi 함수는 원래 ui에서 py로 변환할 때 한글 텍스트의 호환을 위해서 지정된 함수지만, 저는 각 위젯에 입력할 텍스트들을 한데 묶어서 함수로 지정하였습니다.
setText가 그런 역할(텍스트 설정)을 하는 메소드입니다.

초기화면에서 시그널을 발생시킬 수 있는 부분은 PushButton가 존재합니다.
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.start) 부분을 보시면 버튼을 clicked하는 시그널이 발생한다면 제가 만들어 놓은 start함수가 실행되게 슬롯을 설하였습니다. 시그널 및 슬롯의 매칭은 위와 같은 형식으로 설정되며 각 위젯마다 발생하는 시그널은 다르기 때문에 help함수를 이용하여 QtCore와 QtGui의 메소드를 찾아보시면 됩니다!

start함수는 아이디와 비밀번호가 저장되어있는 DB를 열어 열람 후 확인 하는 함수입니다. (확인하는 코딩은 생략)
lineEdit.text() 현재 LineEdit에 입력되어있는 텍스트를 받아들이는 메소드입니다. 받아들인 텍스트를 num이라는 변수에 할당하였습니다. 이하 코드는 MySQL과 연동하는 코드입니다. 해당 DB의 사용자와 비밀번호, 서버주소, 사용하려는 데이터베이스 이름을 입력하여 DB에 접속하게 됩니다. 

cursor는 쉽게말해 마우스 커서와 같이 Python(사용자)와 MySQL(컴퓨터)간의 상호작용을 담당합니다.
커서가 있어야 Python에서 쿼리문을 실행시킬 수 있습니다. 쿼리문은 cursor.execute() 메소드를 사용합니다.
cursor.fetchone()는 앞서 실행시킨 쿼리문의 결과를 받아들여 그 중 하나의 결과만을 가져오는 코드입니다.
즉, 결과의 한 줄만을 가져와 리스트로 저장됩니다. 위의 경우 confirm이라는 리스트에 저장되는 것입니다.
전체를 가져오는 것은 fetchall() 입니다.

다음은 Table widget의 코드입니다. 각 기능은 다음 주석과 같습니다.

cursor.execute("select * from ex2 where 학년=1 and 학기=1")
        result = cursor.fetchall()
        self.TableWidget.setColumnCount(4)        #세로 열 개수를 설정합니다
        self.TableWidget.setRowCount(12)           #가로 행 개수를 설정합니다. 적당한 행과 열이 존재하지않을 경우
        n=-1                                                     #테이블의 데이터가 보이지 않습니다!
        for i in result:
            n=n+1
            obje = QtGui.QTableWidgetItem(i[3])            #테이블의 데이터는 아이템 형식으로 입력합니다
            area = QtGui.QTableWidgetItem(i[2])            #DB의 데이터를 리스트로 잘라 순서대로 아이템으로 만듭니다
            grad = QtGui.QTableWidgetItem(i[5])
            score = QtGui.QTableWidgetItem(str(i[4]))
            self.all_Table.setItem(n, 1, obje)                  #아이템은 엑셀의 좌표와 같은 위치로 지정하여 입력합니다
            self.all_Table.setItem(n, 0, area)                  #즉 테이블의 제일 처음 셀의 위치는 (0,0)이 됩니다
            self.all_Table.setItem(n, 3, grad)
            self.all_Table.setItem(n, 2, score)

''' 테이블의 머리부분의 이름을 지정하는 메소드입니다. 머리 부분이므로 순서대로 인덱스가 정해집니다.'''
        Area = QtGui.QTableWidgetItem("영역");self.all_Table.setHorizontalHeaderItem(0, Area)    
        Obje = QtGui.QTableWidgetItem("과목");self.all_Table.setHorizontalHeaderItem(1, Obje)    
        Score= QtGui.QTableWidgetItem("학점");self.all_Table.setHorizontalHeaderItem(2, Score) 
        Grad = QtGui.QTableWidgetItem("성적");self.all_Table.setHorizontalHeaderItem(3, Grad)   
        self.all_Table.setColumnWidth(0,50);self.all_Table.setColumnWidth(1,180);    #가로 폭의 크기를 설정합니다
        self.all_Table.setColumnWidth(2,50);self.all_Table.setColumnWidth(3,50)      #해당 인덱스로 열을 선택합니다

마지막으로 ComboBox와 Listwidget , RadioButton에 대한 코드입니다.

#ComboBox-----------------------------
''' 콤보박스도 아이템으로 데이터를 입력합니다. 아래와 같이 addItems매소드를 이용하여 리스트를 추가합니다.
    넣으려는 리스트 순서대로 콤보박스에 입력되어지며 사용자가 선택한 아이템의 인덱스를 받아들여서 사용합니다.'''
scorecombo.addItems(["A+","A","B+","B","C+","C","D+","D","F","P"])

''' 만약 현재 B+을 선택한 상태이면 currentIndex메소드가 2라는 인덱스를 가져오고 itemText가 인덱스가 2에 해당하는
    텍스트 아이템을 가져와 변수 T에 할당하게됩니다.'''
T=self.scorecombo.itemText(self.scorecombo.currentIndex())       
    

#Listwidget-----------------------------
''' 리스트 위젯도 아이템으로 데이터를 입력하며 콤보박스와 원리가 똑같습니다.'''
Listwidget.addItems(["항목1","항목2","항목3","항목4"])        
Listwidget.addItem(i[3])                #기존에 존재하던 리스트의 항목도 추가할 수 있습니다.
Listwidget.currentItem().text()        #리스트에서는 currentItem메소드를 이용해 
                                                 #아이템을 text화 하여 변수에 할당할 수 있습니다.


#RadioButton---------------------------
''' 라디오버튼는 다수의 클릭 버튼 중에서 단 하나만을 체크해야 할 경우 사용됩니다. 중복하여 체크가 되지않죠!
    isChecked를 이용하면 해당하는 버튼이 체크되어있는 상태인지를 True / False로 반환합니다.
    체크가 되어있다면 True값을 반환합니다. 주로 if & else구문과 같이 이용하여 사용하게 됩니다.'''

if self.RadioButton_1.isChecked():
       cursor.execute("select * from ex2 where 학년=1 and 학기=%s"%T)
       result = cursor.fetchall()
       for i in result:
            self.major_list.addItem(i[3])
elif self.RadioButton_2.isChecked():

'''{생략}'''

이상으로 위젯들의 기능에 대해 설명을 마치겠습니다. 감사합니다'u'

댓글