Side Project#/PEDU

Develop PEDU with pyqt4 - 4

ch4rli3kop 2018. 6. 27. 02:19
반응형

이번 글에서는 프로그램의 각 영역을 분할하여 각 각에 다른 위젯을 할당함으로써, 

기존에 설계했던 방식인 pe 구조 | hex view | 설명 창 구조로 만들기 위한 기반 작업을 수행하도록 하겠습니다. 

해당 작업을 하기 위해, pyqt4 의 QSplitter 라는 클래스를 이용하여 프로그램 창의 각 부분을 나누도록 하였습니다.

MainWindow와 독립적으로 구현하기 위해서, subWindow라는 하위 클래스를 만들어 이 클래스를 QSplitter로 3등분 분할한 뒤, MainWindow의 CentralWidget으로 등록함으로써 구현했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
from PyQt4.QtGui import *
from PyQt4.QtCore import*
import sys
 
 
class MyWindow(QMainWindow):
   def __init__(self):
      QMainWindow.__init__(self)
 
      ### 윈도우 특성 설정 ###
      self.setWindowTitle('PEDU')
      self.setGeometry(400,200,1500,600)
      #self.setWindowIcon(QIcon(''))
      self.statusBar().showMessage('ready')
      self.creat_menubar_child()
      self.creat_menubar()
      subWin = subWindow()
      self.setCentralWidget(subWin)
      self.show()
 
 
   def creat_menubar_child(self):
      ### 메뉴바 설정 ###
      #load file
      self.fileAction1 = QAction("load file",self)
      self.fileAction1.setShortcut("Ctrl+O")
      self.fileAction1.setStatusTip("Load the file in local place")# 밑에서 상태를 알려줌
      self.fileAction1.triggered.connect(self.open_file)
 
      #exit 
      self.fileAction2 = QAction("Exit",self)
      self.fileAction2.setShortcut("Ctrl+C")
      self.fileAction2.setStatusTip("Exit the App")
      self.fileAction2.triggered.connect(self.close_window)
 
      #change font
      self.fileAction3 = QAction("Change Font",self)
      self.fileAction3.setShortcut("Ctrl+T")
      self.fileAction3.setStatusTip("Change the string font in application")
      self.fileAction3.triggered.connect(self.change_font)
 
 
   def creat_menubar(self):
      ### MenuBar ###
      mainMenu = self.menuBar()
      
      #File      
      fileMenu1 = mainMenu.addMenu('File')
      fileMenu1.addAction(self.fileAction1)
      fileMenu1.addAction(self.fileAction2)
 
      #Option
      fileMenu2 = mainMenu.addMenu('Options')
      fileMenu2.addAction(self.fileAction3)
 
      #Tool
      fileMenu3 = mainMenu.addMenu('Tools')
 
 
      ### toolbar 설정 ###
      #open_file
      # openIcon = QIcon()
      # openIcon.addFile('openFileImage2.png', QSize(16,16))
      # openAction = QAction(toolIcon, 'open_file', self)
      openAction = QAction(QIcon('file_open.png'), 'Open', self)
      openAction.triggered.connect(self.open_file)
 
      #exit_file
      exitAction = QAction(QIcon('exit.png'), 'Exit', self)
      exitAction.triggered.connect(self.close_window)
 
      #change_font
      setFontAction = QAction(QIcon('option.png'), 'Setting', self)
      setFontAction.triggered.connect(self.change_font)
 
 
      #open_file2
      self.openToolBar = self.addToolBar("Open")
      self.openToolBar.addAction(openAction)
 
      #exit_file2
      self.exitToolBar = self.addToolBar("Exit")
      self.exitToolBar.addAction(exitAction) 
 
      #change_font2
      self.setToolBar = self.addToolBar("Setting")
      self.setToolBar.addAction(setFontAction)
 
 
   def open_file(self):
      global filename
      filename = QFileDialog.getOpenFileName(self, "Select file")
      global Pfile
      Pfile = pefile.PE(filename)
 
 
   def close_window(self):
      result = QMessageBox.question(self, 'Message',"Are you sure you leave?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
 
      if result == QMessageBox.Yes:
         sys.exit()
      else:
         pass
      
 
   def change_font(self):
      font, valid = QFontDialog.getFont()
      if valid:
         self.styleChoice.setFont(font)
 
 
class subWindow(QWidget):
 
   def __init__(self):
      QWidget.__init__(self)
      self.creat_split_window()
      self.show()
 
 
   def creat_split_window(self):   
 
      hbox = QHBoxLayout()
      
      splitter1 = QSplitter(Qt.Horizontal)
 
      firstSection = QTextEdit()
      secondSection = QTextEdit()
      thirdSection = QTextEdit()
      
      splitter1.addWidget(firstSection)
      splitter1.addWidget(secondSection)
 
      #splitter1.addWidget(hexview)
      splitter1.setSizes([300,800])
 
      splitter2 = QSplitter(Qt.Horizontal)
      splitter2.addWidget(splitter1)
      splitter2.addWidget(thirdSection)
      splitter2.setSizes([1500,500])
 
      hbox.addWidget(splitter2)
      #QApplication.setStyle(QStyleFactory.create('Cleanlooks'))
      self.setLayout(hbox)
 
 
if __name__ == '__main__':
   app = QApplication(sys.argv)
   ex = MyWindow()
   sys.exit(app.exec_())
cs


완성된 프로그램은 다음과 같습니다.


보시다시피 splitter로 구현함으로써, 각 각의 영역의 크기를 자유자재로 조절할 수 있도록 하였습니다. 다음 포스팅에서는 저 splitter로 나눈 영역들을 하나 하나씩 채워나가며, 최종적으로는 각 영역들이 서로 통신할 수 있도록 하는 작업을 수행하도록 하겠습니다.


반응형

'Side Project# > PEDU' 카테고리의 다른 글

Develop PEDU with pyqt4 - 3  (0) 2018.06.27
Develop PEDU with pyqt4 - 2  (0) 2018.06.27
Develop PEDU with pyqt4 - 1  (0) 2018.06.27
Develop PEDU with pyqt4  (0) 2018.06.26