Некорректно работает задний план в 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 шт):

Автор решения: S. Nick

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_())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка