first commit
This commit is contained in:
48
frameless.py
Normal file
48
frameless.py
Normal 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
53
frameless_for_MsWindow.py
Normal 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
60
mainwindow.py
Normal 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
277
mainwindow.ui
Normal 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
3
requirements.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
PyQt6==6.10.2
|
||||
PyQt6-Qt6==6.10.2
|
||||
PyQt6_sip==13.11.0
|
||||
Reference in New Issue
Block a user