def __init__(self, control, screens: list) -> None: super().__init__(flags=Qt.FramelessWindowHint) self.setWindowTitle("My player") self.control = control self.mainWidget = MainWidget(self.control, self, screens) color = QPalette() color.setColor(QPalette.Background, QColor(20, 20, 20)) self.setPalette(color) self.setCentralWidget(self.mainWidget) self.menuBar = self.mainWidget.menus self.setMinimumSize(1000, 800) self.setFocusPolicy(Qt.StrongFocus) self.setMouseTracking(True) self.timer = QTimer() self.timer.setInterval(200) self.timer.timeout.connect(self.getMousePos) self.timer.start() self.move((screens[0].geometry().width() - self.width()) // 2, (screens[0].geometry().height() - self.height()) // 2) self.right = self.left = self.up = self.down = False self.start = QPoint(0, 0) self.gripSize = 10 self.grips = [] self.pressedForMenuBar = False for i in range(4): grip = QSizeGrip(self) grip.setStyleSheet("background-color: transparent") grip.resize(self.gripSize, self.gripSize) self.grips.append(grip)
class MainWindow(QWidget): def __init__(self): QWidget.__init__(self) self.ui = Ui_Form() self.ui.setupUi(self) self.ui.retranslateUi(self) self.uiDefinitions() self.startUpValues(loadFromRegistry()) self.buttonFunctions() self.show() #################################### # UI Design and Mouse Click Events # #################################### # Move Window def moveWindow(event): # Restore before move if GLOBAL_STATE == 1: self.maximize_restore() # If left click, move window if event.buttons() == Qt.LeftButton: self.move(self.pos() + event.globalPos() - self.dragPos) self.dragPos = event.globalPos() event.accept() # Set Title Bar (This is where you click to move window) self.ui.frame_top.mouseMoveEvent = moveWindow def mousePressEvent(self, event): self.dragPos = event.globalPos() def uiDefinitions(self): # Remove Title Bar self.setWindowFlag(QtCore.Qt.FramelessWindowHint) self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # Set Drop Shadow Window self.shadow = QGraphicsDropShadowEffect(self) self.shadow.setBlurRadius(20) self.shadow.setXOffset(0) self.shadow.setYOffset(0) self.shadow.setColor(QColor(0, 0, 0, 100)) # Apply Drop Shadow Frame self.ui.frame_background.setGraphicsEffect(self.shadow) # Maximize / Restore self.ui.btn_maximize.clicked.connect(lambda: self.maximize_restore()) # Minimize self.ui.btn_minimize.clicked.connect(lambda: self.showMinimized()) # Close self.ui.btn_close.clicked.connect(lambda: self.close()) # Create size grip to resize window self.sizegrip = QSizeGrip(self.ui.frame_grip) self.sizegrip.setStyleSheet( "QSizeGrip { width: 10px; height: 10px; margin: 5px } QSizeGrip:hover { background-color: rgb(50, 42, 94) }" ) def maximize_restore(self): global GLOBAL_STATE status = GLOBAL_STATE # IF NOT MAXIMIZED if status == 0: GLOBAL_STATE = 1 self.showMaximized() else: GLOBAL_STATE = 0 self.showNormal() ######################################## # Start Up Values and Button Functions # ######################################## # Start Up Values def startUpValues(self, registry): # Initiate test date from registry self.ui.lineEdit_testDate.setText(registry['testDate']) # Initiate Questions Complete from registry self.ui.lineEdit_questionsComplete.setText( registry['questionsComplete']) # Initiate Questions Total from registry self.ui.lineEdit_totalQuestions.setText(registry['totalQuestions']) # Set Days Until Test self.testDateEdited(self.ui.lineEdit_testDate.text()) # Set Questions Remaining, Questions Complete, and Questions per Day self.questionsCompleteEdited(self.ui.lineEdit_questionsComplete.text()) # Set the Date self.ui.label_todaysDateEdit.setText(self.getTodaysDate()) # Button Actions def buttonFunctions(self): # Change test Date self.ui.lineEdit_testDate.textChanged.connect(self.testDateEdited) # Change questions completed self.ui.lineEdit_questionsComplete.textChanged.connect( self.questionsCompleteEdited) # Change Total Questions self.ui.lineEdit_totalQuestions.textChanged.connect( self.totalQuestionsEdited) # Get Today's Date def getTodaysDate(self): today = date.today() return today.strftime("%m/%d/%Y") # Test Date edited def testDateEdited(self, testDate): # Test Date # Use try/except statement to check for valid try: testDate = datetime.datetime.strptime(testDate, '%m/%d/%Y') except: return julianTestDate = testDate.timetuple() # Today's Date today = date.today() julianToday = today.timetuple() # Check if test crosses the 1-Year mark (Not going to account for leap-years) julianTestDate = (julianTestDate.tm_year - julianToday.tm_year) * 365 + julianTestDate.tm_yday julianToday = julianToday.tm_yday # Days until test DaysUntilTest = julianTestDate - julianToday self.ui.label_daysUntilTestEdit.setText(str(DaysUntilTest)) # Questions per Day questionsComplete = int(self.ui.lineEdit_questionsComplete.text()) totalQuestions = int(self.ui.lineEdit_totalQuestions.text()) # Calculate Julian Date if the date does not equal todays date. Otherwise, return 0 if julianTestDate != julianToday: self.ui.label_questionsPerDayEdit.setText( str((totalQuestions - questionsComplete) // int(self.ui.label_daysUntilTestEdit.text()))) else: self.ui.label_questionsPerDayEdit.setText( str(totalQuestions - questionsComplete)) # Registry saveToRegistry('testDate', self.ui.lineEdit_testDate.text()) # Questions Complete Change def questionsCompleteEdited(self, questionsComplete): # Check if questions completed is an integer try: questionsComplete = int(questionsComplete) except: return totalQuestions = int(self.ui.lineEdit_totalQuestions.text()) # Set Questions remaining and Percent Complete labels self.ui.label_questionsRemainingEdit.setText( str(totalQuestions - questionsComplete)) self.ui.label_questionsCompleteEdit.setText( str(round(questionsComplete / totalQuestions * 100, 1)) + "%") self.ui.label_questionsPerDayEdit.setText( str( round((totalQuestions - questionsComplete) / int(self.ui.label_daysUntilTestEdit.text()), 1))) # Registry saveToRegistry('questionsComplete', self.ui.lineEdit_questionsComplete.text()) # Questions Complete Change def totalQuestionsEdited(self, totalQuestions): # Check if questions completed is an integer try: totalQuestions = int(totalQuestions) except: return questionsComplete = int(self.ui.lineEdit_questionsComplete.text()) # Set Questions remaining and Percent Complete labels self.ui.label_questionsRemainingEdit.setText( str(totalQuestions - questionsComplete)) self.ui.label_questionsCompleteEdit.setText( str(round(questionsComplete / totalQuestions * 100, 1)) + "%") self.ui.label_questionsPerDayEdit.setText( str( round((totalQuestions - questionsComplete) / int(self.ui.label_daysUntilTestEdit.text()), 1))) # Registry saveToRegistry('totalQuestions', self.ui.lineEdit_totalQuestions.text())
class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.text = "" ## WINDOW SIZE ==> Varsayılan ekran boyutları startSize = QSize(500, 600) self.resize(startSize) self.setMinimumSize(startSize) ## LOAD DEFINITIONS ==> Arayüz dışındaki çerçevenin kaldırılması ######################################################################## self.uiDefinitions() ## ==> END ## ## CLİCKED BUTTON ==> Arayüzdeki butonlara basılması durumları self.ui.pushButton.clicked.connect(self.Button) self.ui.pushButton_2.clicked.connect(self.Button) self.ui.pushButton_3.clicked.connect(self.Button) self.ui.pushButton_4.clicked.connect(self.Button) self.ui.pushButton_5.clicked.connect(self.Button) self.ui.pushButton_6.clicked.connect(self.Button) self.ui.pushButton_7.clicked.connect(self.Button) self.ui.pushButton_8.clicked.connect(self.Button) self.ui.pushButton_9.clicked.connect(self.Button) self.ui.pushButton_10.clicked.connect(self.Button) self.ui.pushButton_11.clicked.connect(self.Button) self.ui.pushButton_12.clicked.connect(self.Button) self.ui.pushButton_13.clicked.connect(self.Button) self.ui.pushButton_14.clicked.connect(self.Button) self.ui.pushButton_15.clicked.connect(self.Button) self.ui.pushButton_16.clicked.connect(self.Button) self.ui.pushButton_17.clicked.connect(self.Button) self.ui.pushButton_18.clicked.connect(self.Button) self.ui.pushButton_19.clicked.connect(self.Button) self.ui.pushButton_20.clicked.connect(self.Button) ## ==> END ## ## SHOW ==> Arayüz gösterme ######################################################################## self.show() ## ==> END ## ## TRANSACTİON ==> Sonuç üretme ######################################################################## def islem(self): if not self.text: pass else: try: float(self.text) self.ui.label_2.setText(self.text) except ValueError: if "*" in self.text: a = self.text.replace(",", ".").split("*") self.ui.label_2.setText(str(float(a[0]) * float(a[1]))) elif "/" in self.text: a = self.text.replace(",", ".").split("/") self.ui.label_2.setText(str(float(a[0]) / float(a[1]))) elif "+" in self.text: a = self.text.replace(",", ".").split("+") self.ui.label_2.setText(str(float(a[0]) + float(a[1]))) elif "-" in self.text: a = self.text.replace(",", ".").split("-") self.ui.label_2.setText(str(float(a[0]) - float(a[1]))) ## ==> END ## ## MENUS ==> Butonlara basılma durumları ######################################################################## def Button(self): # GET BT CLICKED ==> Hangi butona basıldığını bulma btnWidget = self.sender() if btnWidget.text() == "AC": self.text = "" self.ui.label_2.setText("0") elif btnWidget.text() == "=": self.islem() elif btnWidget.text() == "+/-": a = float(self.text.replace(",", ".")) a *= -1 self.text = str(a) else: self.text += btnWidget.text() self.ui.label.setText(self.text) ## ==> END ## ## EVENT ==> Klavye üzerindeki butonlar ile işlem yapma ######################################################################## def keyPressEvent(self, event): if str(event.key()) == "16777220": self.islem() elif str(event.key()) == "16777219": self.text = self.text[:-1] self.ui.label.setText(self.text) else: self.text += str(event.text()) self.ui.label.setText(self.text) ## ==> END ## ##MAXIMIZE/RESTORE ==> Tam ekran yapma ######################################################################## def maximize_restore(self): global GLOBAL_STATE status = GLOBAL_STATE if status == 0: self.showMaximized() GLOBAL_STATE = 1 self.ui.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.ui.btn_maximize_restore.setToolTip("Restore") self.ui.btn_maximize_restore.setIcon( QtGui.QIcon(u":/16x16/icons/16x16/cil-window-restore.png")) self.ui.frame_top_btns.setStyleSheet( "background-color: rgb(27, 29, 35)") self.ui.frame_size_grip.hide() else: GLOBAL_STATE = 0 self.showNormal() self.resize(self.width() + 1, self.height() + 1) self.ui.horizontalLayout.setContentsMargins(10, 10, 10, 10) self.ui.btn_maximize_restore.setToolTip("Maximize") self.ui.btn_maximize_restore.setIcon( QtGui.QIcon(u":/16x16/icons/16x16/cil-window-maximize.png")) self.ui.frame_top_btns.setStyleSheet( "background-color: rgba(27, 29, 35, 200)") self.ui.frame_size_grip.show() ## UI DEFINITIONS==> Arayüz ve üzerindeki butonlarla ilgili işlemler ######################################################################## def uiDefinitions(self): def dobleClickMaximizeRestore(event): # IF DOUBLE CLICK CHANGE STATUS ==> Üst kısıma 2 kere basıldığında tam ekran yapma if event.type() == QtCore.QEvent.MouseButtonDblClick: QtCore.QTimer.singleShot(250, lambda: self.maximize_restore()) ## REMOVE ==> STANDARD TITLE BAR ==> standart ekran boyutu if GLOBAL_TITLE_BAR: self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.setAttribute(QtCore.Qt.WA_TranslucentBackground) self.ui.frame_label_top_btns.mouseDoubleClickEvent = dobleClickMaximizeRestore else: self.ui.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.ui.frame_label_top_btns.setContentsMargins(8, 0, 0, 5) self.ui.frame_label_top_btns.setMinimumHeight(42) self.ui.frame_icon_top_bar.hide() self.ui.frame_btns_right.hide() self.ui.frame_size_grip.hide() ## SHOW ==> DROP SHADOW ==> gölge düşürme self.shadow = QGraphicsDropShadowEffect(self) self.shadow.setBlurRadius(17) self.shadow.setXOffset(0) self.shadow.setYOffset(0) self.shadow.setColor(QColor(0, 0, 0, 150)) self.ui.frame_main.setGraphicsEffect(self.shadow) ## ==> RESIZE WINDOW ==>Ana Ekran Boyutlandırma self.sizegrip = QSizeGrip(self.ui.frame_size_grip) self.sizegrip.setStyleSheet( "width: 20px; height: 20px; margin 0px; padding: 0px;") ### ==> MINIMIZE ==> Minumum butonuna basıldığında self.ui.btn_minimize.clicked.connect(lambda: self.showMinimized()) ## ==> MAXIMIZE/RESTORE ==> Maximum butonuna basıldığında self.ui.btn_maximize_restore.clicked.connect( lambda: self.maximize_restore()) ## SHOW ==> CLOSE APPLICATION ==> Kapatma butonuna basıldığında self.ui.btn_close.clicked.connect(lambda: self.close())
class Ui_MainWindow(QMainWindow): def __init__(self, controller): super().__init__() self.main_controller = controller # create and setup Window from Ui_MainWindow Model self.setupUi(self) # set startsize and minimum size start_size = QSize(1000, 720) self.dragPos = QtCore.QPoint(300, 25) self.resize(start_size) self.setMinimumSize(start_size) # set flags to the window flags = QtCore.Qt.WindowFlags(QtCore.Qt.FramelessWindowHint) self.setWindowFlags(flags) # connenct the buttons self.btn_close.clicked.connect(lambda: self.close()) self.btn_maximise_restore.clicked.connect( lambda: self.main_controller.change_window_format()) self.btn_minimize.clicked.connect(lambda: self.minimize()) self.btn_tgl_menu.clicked.connect(lambda: self.change_sidemenu()) #create function that handles window_drag events def move_window(event): self.main_controller.on_drag_window() if event.buttons() == Qt.LeftButton: self.move(self.pos() + event.globalPos() - self.dragPos) self.dragPos = event.globalPos() event.accept() self.frame_header_top.mouseMoveEvent = move_window #connect frame to sizegrip self.sizegrip = QSizeGrip(self.frame_size_grip) self.sizegrip.setStyleSheet( "width: 20px; height: 20px; margin 0px; padding: 0px;") # SHOW ==> MAIN WINDOW self.show() def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(887, 791) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(6) self.verticalLayout.setObjectName("verticalLayout") self.frame_main = QtWidgets.QFrame(self.centralwidget) self.frame_main.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_main.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_main.setObjectName("frame_main") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.frame_main) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setSpacing(0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.frame_header = QtWidgets.QFrame(self.frame_main) self.frame_header.setMinimumSize(QtCore.QSize(0, 70)) self.frame_header.setMaximumSize(QtCore.QSize(16777215, 70)) self.frame_header.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_header.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_header.setLineWidth(0) self.frame_header.setObjectName("frame_header") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame_header) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setSpacing(0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.frame_toogle = QtWidgets.QFrame(self.frame_header) self.frame_toogle.setMaximumSize(QtCore.QSize(70, 16777215)) self.frame_toogle.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_toogle.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_toogle.setLineWidth(1) self.frame_toogle.setMidLineWidth(1) self.frame_toogle.setObjectName("frame_toogle") self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame_toogle) self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_3.setSpacing(0) self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.btn_tgl_menu = QtWidgets.QPushButton(self.frame_toogle) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.btn_tgl_menu.sizePolicy().hasHeightForWidth()) self.btn_tgl_menu.setSizePolicy(sizePolicy) self.btn_tgl_menu.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.btn_tgl_menu.setStyleSheet( "QPushButton {\n" " background-image: url(:/24x24/icons/24x24/cil-menu.png);\n" " background-position: center;\n" " background-repeat: no-reperat;\n" " border: none;\n" " background-color: rgb(80, 74, 64);\n" "}\n" "QPushButton:hover {\n" " background-color: rgb(133, 127, 114);\n" "}\n" "QPushButton:pressed { \n" " background-color: rgb(98, 93, 82);\n" "}") self.btn_tgl_menu.setText("") self.btn_tgl_menu.setObjectName("btn_tgl_menu") self.horizontalLayout_3.addWidget(self.btn_tgl_menu) self.horizontalLayout_2.addWidget(self.frame_toogle) self.frame_header_content = QtWidgets.QFrame(self.frame_header) self.frame_header_content.setToolTipDuration(0) self.frame_header_content.setStyleSheet( "background-color: rgb(184, 178, 167);") self.frame_header_content.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_header_content.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_header_content.setObjectName("frame_header_content") self.verticalLayout_6 = QtWidgets.QVBoxLayout( self.frame_header_content) self.verticalLayout_6.setContentsMargins(0, 0, 0, 0) self.verticalLayout_6.setSpacing(0) self.verticalLayout_6.setObjectName("verticalLayout_6") self.frame_header_top = QtWidgets.QFrame(self.frame_header_content) self.frame_header_top.setMinimumSize(QtCore.QSize(0, 45)) self.frame_header_top.setMaximumSize(QtCore.QSize(16777215, 45)) self.frame_header_top.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_header_top.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_header_top.setObjectName("frame_header_top") self.horizontalLayout_6 = QtWidgets.QHBoxLayout(self.frame_header_top) self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_6.setSpacing(0) self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.label_title = QtWidgets.QLabel(self.frame_header_top) self.label_title.setStyleSheet("background-color: rgb(80, 74, 64);") self.label_title.setFrameShadow(QtWidgets.QFrame.Raised) self.label_title.setLineWidth(0) self.label_title.setIndent(0) self.label_title.setObjectName("label_title") self.horizontalLayout_6.addWidget(self.label_title) self.btn_minimize = QtWidgets.QPushButton(self.frame_header_top) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.btn_minimize.sizePolicy().hasHeightForWidth()) self.btn_minimize.setSizePolicy(sizePolicy) self.btn_minimize.setMinimumSize(QtCore.QSize(45, 0)) self.btn_minimize.setMaximumSize(QtCore.QSize(45, 16777215)) self.btn_minimize.setStyleSheet( "QPushButton {\n" " background-image: url(:/16x16/icons/16x16/cil-window-minimize.png);\n" " background-position: center;\n" " background-repeat: no-reperat;\n" " border: none;\n" " background-color: rgb(80, 74, 64);\n" "}\n" "QPushButton:hover {\n" " background-color: rgb(133, 127, 114);\n" "}\n" "QPushButton:pressed { \n" " background-color: rgb(98, 93, 82);\n" "}") self.btn_minimize.setText("") self.btn_minimize.setObjectName("btn_minimize") self.horizontalLayout_6.addWidget(self.btn_minimize) self.btn_maximise_restore = QtWidgets.QPushButton( self.frame_header_top) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.btn_maximise_restore.sizePolicy().hasHeightForWidth()) self.btn_maximise_restore.setSizePolicy(sizePolicy) self.btn_maximise_restore.setMinimumSize(QtCore.QSize(45, 0)) self.btn_maximise_restore.setMaximumSize(QtCore.QSize(45, 16777215)) self.btn_maximise_restore.setStyleSheet( "QPushButton {\n" " background-image: url(:/16x16/icons/16x16/cil-window-maximize.png);\n" " background-position: center;\n" " background-repeat: no-reperat;\n" " border: none;\n" " background-color: rgb(80, 74, 64);\n" "}\n" "QPushButton:hover {\n" " background-color: rgb(133, 127, 114);\n" "}\n" "QPushButton:pressed { \n" " background-color: rgb(98, 93, 82);\n" "}") self.btn_maximise_restore.setText("") self.btn_maximise_restore.setObjectName("btn_maximise_restore") self.horizontalLayout_6.addWidget(self.btn_maximise_restore) self.btn_close = QtWidgets.QPushButton(self.frame_header_top) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.btn_close.sizePolicy().hasHeightForWidth()) self.btn_close.setSizePolicy(sizePolicy) self.btn_close.setMinimumSize(QtCore.QSize(45, 0)) self.btn_close.setMaximumSize(QtCore.QSize(45, 16777215)) self.btn_close.setStyleSheet( "QPushButton {\n" " background-image: ;\n" " image: url(:/16x16/icons/16x16/cil-x.png);\n" " background-position: center;\n" " background-repeat: no-reperat;\n" " border: none;\n" " background-color: rgb(80, 74, 64);\n" "}\n" "QPushButton:hover {\n" " background-color: rgb(133, 127, 114);\n" "}\n" "QPushButton:pressed { \n" " background-color: rgb(98, 93, 82);\n" "}") self.btn_close.setText("") self.btn_close.setObjectName("btn_close") self.horizontalLayout_6.addWidget(self.btn_close) self.verticalLayout_6.addWidget(self.frame_header_top) self.frame_header_bottom = QtWidgets.QFrame(self.frame_header_content) self.frame_header_bottom.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_header_bottom.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_header_bottom.setObjectName("frame_header_bottom") self.verticalLayout_6.addWidget(self.frame_header_bottom) self.horizontalLayout_2.addWidget(self.frame_header_content) self.verticalLayout_2.addWidget(self.frame_header) self.frame_center = QtWidgets.QFrame(self.frame_main) self.frame_center.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_center.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_center.setObjectName("frame_center") self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame_center) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setSpacing(0) self.horizontalLayout.setObjectName("horizontalLayout") self.frame_side = QtWidgets.QFrame(self.frame_center) self.frame_side.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_side.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_side.setObjectName("frame_side") self.layout_side = QtWidgets.QHBoxLayout(self.frame_side) self.layout_side.setContentsMargins(0, 0, 0, 0) self.layout_side.setSpacing(0) self.layout_side.setObjectName("layout_side") self.horizontalLayout.addWidget(self.frame_side) self.frame_content = QtWidgets.QFrame(self.frame_center) self.frame_content.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_content.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_content.setObjectName("frame_content") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame_content) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.verticalLayout_3.setSpacing(0) self.verticalLayout_3.setObjectName("verticalLayout_3") self.frame_main_content = QtWidgets.QFrame(self.frame_content) self.frame_main_content.setStyleSheet( "background-color: rgb(66, 61, 51);") self.frame_main_content.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_main_content.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_main_content.setObjectName("frame_main_content") self.horizontalLayout_4 = QtWidgets.QHBoxLayout( self.frame_main_content) self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_4.setSpacing(0) self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.stackedWidget = QtWidgets.QStackedWidget(self.frame_main_content) self.stackedWidget.setObjectName("stackedWidget") self.page_color = QtWidgets.QWidget() self.page_color.setObjectName("page_color") self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.page_color) self.verticalLayout_5.setObjectName("verticalLayout_5") self.color_palett = QtWidgets.QFrame(self.page_color) self.color_palett.setMaximumSize(QtCore.QSize(16777215, 60)) self.color_palett.setFrameShape(QtWidgets.QFrame.StyledPanel) self.color_palett.setFrameShadow(QtWidgets.QFrame.Raised) self.color_palett.setObjectName("color_palett") self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.color_palett) self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.frame_4 = QtWidgets.QFrame(self.color_palett) self.frame_4.setStyleSheet( "background-color: qlineargradient(spread:pad, x1:0, y1:0.523, x2:1, y2:0.5, stop:0 rgb(250, 249, 247), stop:1 rgb(39, 36, 29));" ) self.frame_4.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_4.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_4.setObjectName("frame_4") self.horizontalLayout_5.addWidget(self.frame_4) self.verticalLayout_5.addWidget(self.color_palett) self.frame_3 = QtWidgets.QFrame(self.page_color) self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_3.setObjectName("frame_3") self.verticalLayout_5.addWidget(self.frame_3) self.stackedWidget.addWidget(self.page_color) self.page_2 = QtWidgets.QWidget() self.page_2.setObjectName("page_2") self.stackedWidget.addWidget(self.page_2) self.horizontalLayout_4.addWidget(self.stackedWidget) self.verticalLayout_3.addWidget(self.frame_main_content) self.frame_footer = QtWidgets.QFrame(self.frame_content) self.frame_footer.setMinimumSize(QtCore.QSize(0, 25)) self.frame_footer.setStyleSheet("background-color: rgb(80, 74, 64);") self.frame_footer.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_footer.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_footer.setObjectName("frame_footer") self.horizontalLayout_23 = QtWidgets.QHBoxLayout(self.frame_footer) self.horizontalLayout_23.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_23.setObjectName("horizontalLayout_23") self.frame = QtWidgets.QFrame(self.frame_footer) self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") self.horizontalLayout_23.addWidget(self.frame) self.frame_size_grip = QtWidgets.QFrame(self.frame_footer) self.frame_size_grip.setMinimumSize(QtCore.QSize(25, 0)) self.frame_size_grip.setMaximumSize(QtCore.QSize(25, 16777215)) self.frame_size_grip.setLayoutDirection(QtCore.Qt.LeftToRight) self.frame_size_grip.setStyleSheet( "background-image: url(:/16x16/icons/16x16/cil-size-grip.png);\n" "background-position: center;\n" "background-repeat: no-reperat;") self.frame_size_grip.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame_size_grip.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_size_grip.setObjectName("frame_size_grip") self.horizontalLayout_23.addWidget(self.frame_size_grip) self.verticalLayout_3.addWidget(self.frame_footer) self.horizontalLayout.addWidget(self.frame_content) self.verticalLayout_2.addWidget(self.frame_center) self.frame_center.raise_() self.frame_header.raise_() self.verticalLayout.addWidget(self.frame_main) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) self.stackedWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) def mousePressEvent(self, event): self.dragPos = event.globalPos() def get_centerlayout(self): return self.layout_side def maximize(self): self.showMaximized() self.btn_maximise_restore.setToolTip("Restore") self.btn_maximise_restore.setStyleSheet( "QPushButton {\n" " background-image: ;\n" " image: url(:/16x16/icons/16x16/cil-window-restore.png);" " background-position: center;\n" " background-repeat: no-reperat;\n" " border: none;\n" " background-color: rgb(80, 74, 64);\n" "}\n" "QPushButton:hover {\n" " background-color: rgb(133, 127, 114);\n" "}\n" "QPushButton:pressed { \n" " background-color: rgb(98, 93, 82);\n" "}") def restore(self): self.showNormal() self.move(self.dragPos - QtCore.QPoint(300, 25)) self.btn_maximise_restore.setToolTip("Maximize") self.btn_maximise_restore.setStyleSheet( "QPushButton {\n" " background-image: ;\n" " image: url(:/16x16/icons/16x16/cil-window-maximize.png);\n" " background-position: center;\n" " background-repeat: no-reperat;\n" " border: none;\n" " background-color: rgb(80, 74, 64);\n" "}\n" "QPushButton:hover {\n" " background-color: rgb(133, 127, 114);\n" "}\n" "QPushButton:pressed { \n" " background-color: rgb(98, 93, 82);\n" "}") def minimize(self): self.showMinimized() def change_sidemenu(self): self.main_controller.change_sidemenu()
class MainWindowController(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super(MainWindowController, self).__init__() self.setupUi(self) self.initialize_crawler_processes() def setupUi(self, MainWindow): Ui_MainWindow.setupUi(self, MainWindow) ## REMOVE TITLE BAR self.setWindowFlag(QtCore.Qt.FramelessWindowHint) # self.setAttribute(QtCore.Qt.WA_TranslucentBackground) ## SHOW ==> DROP SHADOW # self.shadow = QGraphicsDropShadowEffect(self) # self.shadow.setBlurRadius(17) # self.shadow.setXOffset(0) # self.shadow.setYOffset(0) # self.shadow.setColor(QColor(0, 0, 0, 150)) # self.frame_main.setGraphicsEffect(self.shadow) # # ==> RESIZE WINDOW self.sizegrip = QSizeGrip(self.frame_size_grip) self.sizegrip.setStyleSheet( "width: 20px; height: 20px; margin 0px; padding: 0px;") ### ==> MINIMIZE self.btn_minimize.clicked.connect(lambda: self.showMinimized()) ## ==> MAXIMIZE/RESTORE self.btn_maximize_restore.clicked.connect( lambda: self.maximize_restore()) ## SHOW ==> CLOSE APPLICATION self.btn_close.clicked.connect(lambda: self.close()) ## TAB ==> tabs button click events self.pushButton_home.clicked.connect(lambda: self.switch_tab("home")) self.pushButton_crawler.clicked.connect( lambda: self.switch_tab("crawler")) self.pushButton_comments.clicked.connect( lambda: self.switch_tab("comments")) self.pushButton_commandInjection.clicked.connect( lambda: self.switch_tab("command_injection")) self.pushButton_localFileInclusion.clicked.connect( lambda: self.switch_tab("local_file_inclusion")) self.pushButton_sqlInjection.clicked.connect( lambda: self.switch_tab("sql_injection")) self.pushButton_stored_xssInjection.clicked.connect( lambda: self.switch_tab("xss_injection")) ##Upload file url events self.pushButton_url_file_open.clicked.connect(self.browse_url_file) ##Crawling event self.pushButton_start_crawling.clicked.connect(self.start_crawling) ##log sys.stdout = ConsoleLog(self.plainTextEdit_home_log, "color:rgb(85, 255, 127);") sys.stderr = ConsoleLog(self.plainTextEdit_home_log, "color:rgb(225, 0, 0);") def initialize_crawler_processes(self): #Crawler process self.crawler_process = QProcess( ) # Keep a reference to the QProcess (e.g. on self) while it's running. self.crawler_process.readyReadStandardOutput.connect( lambda: self.handle_stdout("crawler")) self.crawler_process.readyReadStandardError.connect( lambda: self.handle_stderr("crawler")) # self.p.stateChanged.connect(self.handle_state) self.crawler_process.finished.connect( self.crawler_process_finished) # Clean up once complete. #Scanner process self.scanner_process = QProcess( ) # Keep a reference to the QProcess (e.g. on self) while it's running. self.scanner_process.readyReadStandardOutput.connect( lambda: self.handle_stdout("comments")) self.scanner_process.readyReadStandardError.connect( lambda: self.handle_stderr("comments")) # self.p.stateChanged.connect(self.handle_state) # self.scanner_process.finished.connect(self.crawler_process_finished) # Clean up once complete. #Upload process self.upload_process = QProcess( ) # Keep a reference to the QProcess (e.g. on self) while it's running. self.upload_process.readyReadStandardOutput.connect( lambda: self.handle_stdout("command_injection")) self.upload_process.readyReadStandardError.connect( lambda: self.handle_stderr("command_injection")) # self.p.stateChanged.connect(self.handle_state) # self.upload_process.finished.connect(self.crawler_process_finished) # Clean up once complete. #LFI Scanner process self.lfi_scanner_process = QProcess( ) # Keep a reference to the QProcess (e.g. on self) while it's running. self.lfi_scanner_process.readyReadStandardOutput.connect( lambda: self.handle_stdout("local_file_inclusion")) self.lfi_scanner_process.readyReadStandardError.connect( lambda: self.handle_stderr("local_file_inclusion")) # self.p.stateChanged.connect(self.handle_state) # self.lfi_scanner_process.finished.connect(self.crawler_process_finished) # Clean up once complete. #SQLI Checker process self.sqli_checker_process = QProcess( ) # Keep a reference to the QProcess (e.g. on self) while it's running. self.sqli_checker_process.readyReadStandardOutput.connect( lambda: self.handle_stdout("sql_injection")) self.sqli_checker_process.readyReadStandardError.connect( lambda: self.handle_stderr("sql_injection")) # self.p.stateChanged.connect(self.handle_state) # self.sqli_checker_process.finished.connect(self.crawler_process_finished) # Clean up once complete. #Stored XSS Checker process self.stored_xss_checker_process = QProcess( ) # Keep a reference to the QProcess (e.g. on self) while it's running. self.stored_xss_checker_process.readyReadStandardOutput.connect( lambda: self.handle_stdout("xss_injection")) self.stored_xss_checker_process.readyReadStandardError.connect( lambda: self.handle_stderr("xss_injection")) # self.p.stateChanged.connect(self.handle_state) # self.stored_xss_checker.finished.connect(self.crawler_process_finished) # Clean up once complete. def crawler_process_finished(self): try: # start other process print("Starting Comments") self.scanner_process.start("python", ['tabs/comments/comments.py']) print("Starting Command Injection") self.upload_process.start( "python", ['tabs/command_injection/command_injection.py']) print("Starting Local File Inclusion") self.lfi_scanner_process.start( "python", ['tabs/local_file_inclusion/local_file_inclusion.py']) print("Starting SQL Injection") self.sqli_checker_process.start( "python", ['tabs/sql_injection/sql_injection.py']) print("Starting XSS Injection") self.stored_xss_checker_process.start( "python", ['tabs/xss_injection/xss_injection.py']) except Exception as e: print(e) def start_crawling(self): filename = self.lineEdit_url_file_path.text().strip() if filename != "": try: links = open(filename).read().strip().split("\n") print("Links Found") for link in links: print(link) self.crawler_process.start("python", ['tabs/crawler/crawler.py']) print("Crawler Started!") except Exception as e: print(e) else: raise Exception("Please command_injection a url file first") def handle_stdout(self, process): if process == "crawler": self.plainTextEdit_crawler_log.setStyleSheet( "color:rgb(85, 255, 127);") text = bytes( self.crawler_process.readAllStandardOutput()).decode("utf8") self.plainTextEdit_crawler_log.insertPlainText(text) elif process == "comments": self.plainTextEdit_comments_log.setStyleSheet( "color:rgb(85, 255, 127);") text = bytes( self.scanner_process.readAllStandardOutput()).decode("utf8") self.plainTextEdit_comments_log.insertPlainText(text) elif process == "command_injection": self.plainTextEdit_command_injection_log.setStyleSheet( "color:rgb(85, 255, 127);") text = bytes( self.upload_process.readAllStandardOutput()).decode("utf8") self.plainTextEdit_command_injection_log.insertPlainText(text) elif process == "local_file_inclusion": self.plainTextEdit_local_file_inclusion_log.setStyleSheet( "color:rgb(85, 255, 127);") text = bytes( self.lfi_scanner_process.readAllStandardOutput()).decode( "utf8") self.plainTextEdit_local_file_inclusion_log.insertPlainText(text) elif process == "sql_injection": self.plainTextEdit_sql_injection_log.setStyleSheet( "color:rgb(85, 255, 127);") text = bytes( self.sqli_checker_process.readAllStandardOutput()).decode( "utf8") self.plainTextEdit_sql_injection_log.insertPlainText(text) elif process == "xss_injection": self.plainTextEdit_xss_injection_log.setStyleSheet( "color:rgb(85, 255, 127);") text = bytes(self.stored_xss_checker_process.readAllStandardOutput( )).decode("utf8") self.plainTextEdit_xss_injection_log.insertPlainText(text) else: self.plainTextEdit_home_log.setStyleSheet( "color:rgb(85, 255, 127);") text = str(self.process.readAllStandardOutput()) self.plainTextEdit_home_log.insertPlainText(text) def handle_stderr(self, process): if process == "crawler": self.plainTextEdit_crawler_log.setStyleSheet( "color:rgb(225, 0, 0);") text = bytes( self.crawler_process.readAllStandardError()).decode("utf8") self.plainTextEdit_crawler_log.insertPlainText(text) elif process == "comments": self.plainTextEdit_comments_log.setStyleSheet( "color:rgb(225, 0, 0);") text = bytes( self.scanner_process.readAllStandardError()).decode("utf8") self.plainTextEdit_comments_log.insertPlainText(text) elif process == "command_injection": self.plainTextEdit_command_injection_log.setStyleSheet( "color:rgb(225, 0, 0);") text = bytes( self.upload_process.readAllStandardError()).decode("utf8") self.plainTextEdit_command_injection_log.insertPlainText(text) elif process == "local_file_inclusion": self.plainTextEdit_local_file_inclusion_log.setStyleSheet( "color:rgb(225, 0, 0);") text = bytes( self.lfi_scanner_process.readAllStandardError()).decode("utf8") self.plainTextEdit_local_file_inclusion_log.insertPlainText(text) elif process == "sql_injection": self.plainTextEdit_sql_injection_log.setStyleSheet( "color:rgb(225, 0, 0);") text = bytes( self.sqli_checker_process.readAllStandardError()).decode( "utf8") self.plainTextEdit_sql_injection_log.insertPlainText(text) elif process == "xss_injection": self.plainTextEdit_xss_injection_log.setStyleSheet( "color:rgb(225, 0, 0);") text = bytes( self.stored_xss_checker_process.readAllStandardError()).decode( "utf8") self.plainTextEdit_xss_injection_log.insertPlainText(text) else: text = str(self.process.readAllStandardError()) self.plainTextEdit_home_log.insertPlainText(text) def browse_url_file(self): options = QFileDialog.Options() # options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getOpenFileName( self, "Open URL File", "", "Text Files (*);;URL File (*.txt)", options=options) if fileName: print("URL File Selected: " + fileName) self.lineEdit_url_file_path.setText(fileName) else: print("No File Selected!") def reset_tab_buttons_color(self): self.pushButton_home.setStyleSheet("padding:10px 15px;color:white;") self.pushButton_crawler.setStyleSheet("padding:10px 15px;color:white;") self.pushButton_comments.setStyleSheet( "padding:10px 15px;color:white;") self.pushButton_commandInjection.setStyleSheet( "padding:10px 15px;color:white;") self.pushButton_localFileInclusion.setStyleSheet( "padding:10px 15px;color:white;") self.pushButton_sqlInjection.setStyleSheet( "padding:10px 15px;color:white;") self.pushButton_stored_xssInjection.setStyleSheet( "padding:10px 15px;color:white;") def switch_tab(self, tab): if tab == "home": self.reset_tab_buttons_color() self.pushButton_home.setStyleSheet( "padding:10px 15px;color:white;background-color:rgb(0, 170, 255);" ) self.stackedWidget_tabs.setCurrentIndex(0) elif tab == "crawler": self.reset_tab_buttons_color() self.pushButton_crawler.setStyleSheet( "padding:10px 15px;color:white;background-color:rgb(0, 170, 255);" ) self.stackedWidget_tabs.setCurrentIndex(1) elif tab == "comments": self.reset_tab_buttons_color() self.pushButton_comments.setStyleSheet( "padding:10px 15px;color:white;background-color:rgb(0, 170, 255);" ) self.stackedWidget_tabs.setCurrentIndex(2) elif tab == "command_injection": self.reset_tab_buttons_color() self.pushButton_commandInjection.setStyleSheet( "padding:10px 15px;color:white;background-color:rgb(0, 170, 255);" ) self.stackedWidget_tabs.setCurrentIndex(3) elif tab == "local_file_inclusion": self.reset_tab_buttons_color() self.pushButton_localFileInclusion.setStyleSheet( "padding:10px 15px;color:white;background-color:rgb(0, 170, 255);" ) self.stackedWidget_tabs.setCurrentIndex(4) elif tab == "sql_injection": self.reset_tab_buttons_color() self.pushButton_sqlInjection.setStyleSheet( "padding:10px 15px;color:white;background-color:rgb(0, 170, 255);" ) self.stackedWidget_tabs.setCurrentIndex(5) elif tab == "xss_injection": self.reset_tab_buttons_color() self.pushButton_stored_xssInjection.setStyleSheet( "padding:10px 15px;color:white;background-color:rgb(0, 170, 255);" ) self.stackedWidget_tabs.setCurrentIndex(6) def maximize_restore(self): global GLOBAL_STATE status = GLOBAL_STATE if status == 0: self.showMaximized() GLOBAL_STATE = 1 # self.centralWidget.setContentsMargins(0, 0, 0, 0) self.btn_maximize_restore.setToolTip("Restore") self.btn_maximize_restore.setIcon( QtGui.QIcon(u":/16x16/icons/16x16/cil-window-restore.png")) self.frame_top_btns.setStyleSheet( "background-color: rgb(27, 29, 35)") self.frame_size_grip.hide() else: GLOBAL_STATE = 0 self.showNormal() self.resize(800, 600) # self.ui.horizontalLayout.setContentsMargins(10, 10, 10, 10) self.btn_maximize_restore.setToolTip("Maximize") self.btn_maximize_restore.setIcon( QtGui.QIcon(u":/16x16/icons/16x16/cil-window-maximize.png")) self.frame_top_btns.setStyleSheet( "background-color: rgba(27, 29, 35, 200)") self.frame_size_grip.show()
class StatusBar(QWidget): def __init__(self, parent): super().__init__() self.initUI() def initUI(self): self.centralFrame = QFrame(self) self.centralFrame.setFrameShape(QFrame.NoFrame) self.centralFrame.setFrameShadow(QFrame.Raised) self.centralFrame.setMinimumSize(QSize(0, 25)) self.centralFrame.setMaximumSize(QSize(16777215, 25)) self.centralFrame.setContentsMargins(0, 0, 0, 0) self.centralFrame.setStyleSheet(u"background-color: rgb(27, 29, 35);") self.labelsFrame = QFrame(self.centralFrame) self.labelsFrame.setFrameShape(QFrame.NoFrame) self.labelsFrame.setFrameShadow(QFrame.Raised) self.labelsFrame.setContentsMargins(0, 0, 0, 0) self.labelsFrame.setStyleSheet("border: none;") self.developerLabel = Label(self.labelsFrame) self.developerLabel.setText("Ashwin Sakhare") self.instituteLabel = Label(self.labelsFrame) self.instituteLabel.setText( "Stevens Neuroimaging and Informatics Institute") self.universityLabel = Label(self.labelsFrame) self.universityLabel.setText("University of Southern California") self.labelsLayout = QHBoxLayout(self.labelsFrame) self.labelsLayout.addWidget(self.developerLabel) self.labelsLayout.addWidget(self.instituteLabel) self.labelsLayout.addWidget(self.universityLabel) self.labelsLayout.setSpacing(50) self.labelsLayout.setContentsMargins(10, 0, 0, 0) self.labelsLayout.setAlignment(Qt.AlignLeft) self.versionFrame = QFrame(self.centralFrame) self.versionFrame.setFrameShape(QFrame.NoFrame) self.versionFrame.setFrameShadow(QFrame.Raised) self.versionFrame.setContentsMargins(0, 0, 0, 0) self.versionFrame.setStyleSheet("border: none;") self.versionLabel = Label(self.labelsFrame) self.versionLabel.setText("v1.0.0 alpha") self.versionLayout = QHBoxLayout(self.versionFrame) self.versionLayout.addWidget(self.versionLabel) self.versionLayout.setAlignment(Qt.AlignRight) self.versionLayout.setContentsMargins(0, 0, 20, 0) self.gripFrame = QFrame(self.centralFrame) self.gripFrame.setFrameShape(QFrame.NoFrame) self.gripFrame.setFrameShadow(QFrame.Raised) self.gripFrame.setMaximumSize(QSize(20, 20)) self.gripFrame.setContentsMargins(0, 0, 0, 0) # path = resource_path('icons/cil-size-grip.png') # self.gripFrame.setStyleSheet("background-image: url(" + str(path) + "); \n" # "background-position: center; \n" # "background-repeat: no repeat") self.ui_sizeGrip = QSizeGrip(self.gripFrame) self.ui_sizeGrip.setStyleSheet( "width: 20px; height: 20px; margin 0px; padding: 0px;") self.gripLabel = QLabel(self.gripFrame) self.pixmap = QPixmap(resource_path('icons/cil-size-grip.png')) self.gripLabel.setPixmap(self.pixmap) self.gripLayout = QHBoxLayout(self.gripFrame) self.gripLayout.addWidget(self.gripLabel) self.gripLayout.setAlignment(Qt.AlignCenter) self.gripLayout.setContentsMargins(0, 0, 0, 0) self.centralLayout = QHBoxLayout(self.centralFrame) self.centralLayout.addWidget(self.labelsFrame) self.centralLayout.addWidget(self.versionFrame) self.centralLayout.addWidget(self.gripFrame) self.centralLayout.setSpacing(0) self.centralLayout.setContentsMargins(0, 0, 0, 0) self.uiLayout = QHBoxLayout(self) self.uiLayout.addWidget(self.centralFrame) self.uiLayout.setContentsMargins(0, 0, 0, 0) self.setLayout(self.uiLayout)