first commit

This commit is contained in:
2026-03-02 17:39:26 +01:00
commit 0ce305d76c
5 changed files with 441 additions and 0 deletions

48
frameless.py Normal file
View File

@@ -0,0 +1,48 @@
import sys
import os
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PyQt6.QtCore import Qt, QPoint
# À placer tout en haut, avant les imports PyQt6 si possible
os.environ["QT_QPA_PLATFORM"] = "xcb"
class FenetreSansTitre(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
self.resize(400, 300)
# IMPORTANT : On active le suivi de souris
self.setMouseTracking(True)
layout = QVBoxLayout()
btn_quitter = QPushButton("Quitter")
btn_quitter.clicked.connect(self.close)
layout.addWidget(btn_quitter)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
self._drag_pos = None
def mousePressEvent(self, event):
if event.button() == Qt.MouseButton.LeftButton:
# On enregistre la position du clic RELATIVE au coin haut-gauche de la fenêtre
self._drag_pos = event.position().toPoint()
def mouseMoveEvent(self, event):
if self._drag_pos is not None:
# On déplace la fenêtre vers la position globale du curseur
# MOINS le décalage initial (offset) pour éviter que le curseur ne saute au centre
self.move(event.globalPosition().toPoint() - self._drag_pos)
def mouseReleaseEvent(self, event):
self._drag_pos = None
if __name__ == "__main__":
app = QApplication(sys.argv)
fenetre = FenetreSansTitre()
fenetre.show()
sys.exit(app.exec())

53
frameless_for_MsWindow.py Normal file
View File

@@ -0,0 +1,53 @@
import sys
import os
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PyQt6.QtCore import Qt, QPoint
# À placer tout en haut, avant les imports PyQt6 si possible
os.environ["QT_QPA_PLATFORM"] = "xcb"
class FenetreSansTitre(QMainWindow):
def __init__(self):
super().__init__()
# 1. Retirer la barre de titre
self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
self.resize(400, 300)
# Interface simple
layout = QVBoxLayout()
btn_quitter = QPushButton("Fermer la fenêtre")
btn_quitter.clicked.connect(self.close)
layout.addWidget(btn_quitter)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
# Variable pour stocker la position du clic
self.old_pos = None
# --- Logique de déplacement ---
def mousePressEvent(self, event):
if event.button() == Qt.MouseButton.LeftButton:
# On sauvegarde la position relative du curseur dans la fenêtre
self.old_pos = event.globalPosition().toPoint()
def mouseMoveEvent(self, event):
if self.old_pos is not None:
# Calcul de la distance parcourue
delta = QPoint(event.globalPosition().toPoint() - self.old_pos)
# Déplacement de la fenêtre
self.move(self.x() + delta.x(), self.y() + delta.y())
# Mise à jour de la position de référence
self.old_pos = event.globalPosition().toPoint()
def mouseReleaseEvent(self, event):
self.old_pos = None
if __name__ == "__main__":
app = QApplication(sys.argv)
fenetre = FenetreSansTitre()
fenetre.show()
sys.exit(app.exec())

60
mainwindow.py Normal file
View File

@@ -0,0 +1,60 @@
import sys
import os
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6 import uic
from PyQt6.QtCore import Qt
# À placer tout en haut, avant les imports PyQt6 si possible
os.environ["QT_QPA_PLATFORM"] = "xcb"
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Remove the title bar and window frame
self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
# Optional: Make background transparent (if you want rounded corners, etc.)
# self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
# Track mouse position for dragging
self._drag_pos = None
uic.loadUi("mainwindow.ui", self)
# Find the button by its objectName in Qt Designer
# Example: objectName = "close_btn"
self.close_btn.clicked.connect(self.close_link)
self.minimize_btn.clicked.connect(self.minimize_link)
def close_link(self):
sys.exit(app.exec())
def minimize_link(self):
# Minimize the application
self.setWindowState(Qt.WindowState.WindowMinimized)
# Mouse press event to start dragging
def mousePressEvent(self, event):
if event.button() == Qt.MouseButton.LeftButton:
self._drag_pos = event.globalPosition().toPoint() - self.frameGeometry().topLeft()
event.accept()
# Mouse move event to drag window
def mouseMoveEvent(self, event):
if event.buttons() == Qt.MouseButton.LeftButton and self._drag_pos is not None:
self.move(event.globalPosition().toPoint() - self._drag_pos)
event.accept()
# Mouse release event to stop dragging
def mouseReleaseEvent(self, event):
self._drag_pos = None
event.accept()
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()

277
mainwindow.ui Normal file
View File

@@ -0,0 +1,277 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="windowModality">
<enum>Qt::WindowModality::ApplicationModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1199</width>
<height>703</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>1199</width>
<height>703</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1199</width>
<height>703</height>
</size>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ContextMenuPolicy::NoContextMenu</enum>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="main_container">
<property name="minimumSize">
<size>
<width>1199</width>
<height>703</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1199</width>
<height>703</height>
</size>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QFrame" name="title_bar">
<property name="minimumSize">
<size>
<width>1199</width>
<height>40</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1199</width>
<height>40</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::Shape::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Shadow::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>1006</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="minimize_btn">
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">#minimize_btn {
font: 700 11pt ;
}</string>
</property>
<property name="text">
<string>_</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="close_btn">
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="QIcon::ThemeIcon::SystemShutdown"/>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="frame_2">
<property name="minimumSize">
<size>
<width>1199</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1199</width>
<height>16777215</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::Shape::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Shadow::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QFrame" name="left_column">
<property name="minimumSize">
<size>
<width>350</width>
<height>660</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>350</width>
<height>660</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::Shape::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Shadow::Raised</enum>
</property>
</widget>
</item>
<item>
<widget class="QFrame" name="right_column">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>673</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>673</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::Shape::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Shadow::Raised</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>

3
requirements.txt Normal file
View File

@@ -0,0 +1,3 @@
PyQt6==6.10.2
PyQt6-Qt6==6.10.2
PyQt6_sip==13.11.0