Некорректно работает задний план в QScrollArea
Идея вот в чём: список лэйблов с текстом, с прозрачным фоном, чтобы на заднем плане была видна установленная картинка.
Использую для этого Qt.WA_TranslucentBackground, но при прокрутке вниз label с изображением, который на заднем плане укатывается вместе с текстом.
И ещё одно - как убрать границы окна?
Upd: проблему с фоном решил строкой self.setStyleSheet("background-color: transparent"), но осталась небольшая тонка рамка вокруг окна, которую нужно убрать(видно на скрине ниже).

import sys
from PyQt5 import QtWidgets
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QAction, QLabel, QVBoxLayout, QScrollArea
from threading import Thread
class MyWin(QWidget):
def __init__(self, parent=None):
super(QWidget, self).__init__(parent)
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('win')
self.show()
self.dd = DragNDropWindow()
self.dd.show()
class DragNDropWindow(QWidget, Thread):
def __init__(self):
super(QWidget, self).__init__()
background = QLabel(self)
bpixmap = QPixmap('mindsbackground.png')
background.setPixmap(bpixmap)
self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground, True)
background.show()
with open('minds.txt') as mindList:
mindList = mindList.read()
minds = mindList.split(sep='@@\n@@')
vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.setSpacing(15)
for i in minds:
label = QLabel(self)
label.setText(i)
label.setFixedWidth(420)
label.setStyleSheet('''
font: 10pt "Jack Brusher(RUS BY LYAJKA)";
background-color: #778899;
border-radius: 5px;
color: #FFFFE0;
padding: 15;
''')
label.setContextMenuPolicy(Qt.ActionsContextMenu)
action = QAction("Скрыть текст", self)
action.triggered.connect(label.hide)
label.addAction(action)
vbox.addWidget(label)
self.scrollarea = QScrollArea(self)
self.scrollarea.resize(background.width(), background.height())
self.scrollarea.setWidgetResizable(True)
area = QWidget()
area.setAttribute(Qt.WA_TranslucentBackground, True)
area.setLayout(vbox)
self.scrollarea.setWidget(area)
self.scrollarea.setStyleSheet("""
QScrollBar:vertical {
border: none;
background:white;
width:7px;
margin: 0px 0px 0px 0px;
}
""")
self.resize(background.width(), background.height())
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MyWin()
w.show()
sys.exit(app.exec_())
Ответы (1 шт):
Sorry, я действительно не понимаю, что вы хотите сделать, но я добавил некоторые изменения, которые отметил по тексту.
Теперь окно (назовем его DragNDropWindow) можно перетаскивать.
Добавил контекстного меню "Показать текст".
По закрытию основного окна закрывается и окно DragNDropWindow ...
Пробуйте, может это добавит вам каких-либо идей.
import sys
from PyQt5 import QtWidgets
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QAction, QLabel, QVBoxLayout, QScrollArea
from threading import Thread
class DragNDropWindow(QWidget): #, Thread): # ?
def __init__(self, parent=None): # + parent
super(DragNDropWindow, self).__init__(parent) # + parent
self.setStyleSheet('border: none;') # +++
# +++ vvvvvvvvv
self.setWindowFlags(Qt.Window | Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground, True) # попробуйте закомментировать !!!
self.background = QLabel(self) # + self.
bpixmap = QPixmap('lena-removebg-preview.png') # 'mindsbackground.png'
self.background.setPixmap(bpixmap)
self.background.show()
with open('test.txt') as mindList: # 'minds.txt'
mindList = mindList.read()
minds = mindList.split(sep='@@\n@@')
vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.setSpacing(15)
for i in minds:
label = QLabel(self)
label.setText(i)
label.setFixedWidth(420)
label.setStyleSheet('''
font: 10pt "Jack Brusher(RUS BY LYAJKA)";
background-color: #778899;
border-radius: 5px;
color: #FFFFE0;
padding: 15;
''')
label.setContextMenuPolicy(Qt.ActionsContextMenu)
action = QAction("Скрыть текст", self)
action.triggered.connect(label.hide)
label.addAction(action)
vbox.addWidget(label)
# + добавил перенос слов на label # +++
label.setWordWrap(True)
# + добавил контекстного меню "Показать текст" # +++
self.setContextMenuPolicy(Qt.ActionsContextMenu)
action2 = QAction("Показать текст", self)
action2.triggered.connect(label.show)
self.addAction(action2)
self.scrollarea = QScrollArea(self)
self.scrollarea.resize(self.background.width(), self.background.height())
self.scrollarea.setWidgetResizable(True)
area = QWidget()
area.setAttribute(Qt.WA_TranslucentBackground, True)
area.setLayout(vbox)
self.scrollarea.setWidget(area)
self.scrollarea.setStyleSheet("""
QScrollBar:vertical {
border: none;
background: white;
width: 7px;
margin: 0px 0px 0px 0px;
}
""")
self.resize(self.background.width(), self.background.height())
# +++ VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
# это позволяеи перетаскивать данное окно
self._old_pos = None
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self._old_pos = event.pos()
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self._old_pos = None
def mouseMoveEvent(self, event):
if not self._old_pos:
return
delta = event.pos() - self._old_pos
self.move(self.pos() + delta)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class MyWin(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('MyWin')
# self.show()
self.dd = DragNDropWindow(self) # + self
self.dd.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MyWin()
w.show()
sys.exit(app.exec_())

