Передвижение безрамочного окна PySide6

У меня есть код, который передвигает появившееся окно, но как этот код подключить к другому окну, которое появляется после первого? Мой код находится здесь https://gist.github.com/tR1nZ/4715ccfd33027addf5e7cf00934df63e


Ответы (1 шт):

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

НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный Qt Designer, НИКОГДА!
Создайте другой класс, который наследуется от соответствующего виджета и используйте созданный класс для его заполнения.

И я вам уже раз писал об этом в вашем вопросе Помощь с передвижением безрамочного окна в PySide6 . Почему вы не отвечаете на мои комментарии в нем ?

Ваше полное приложение с формами очень большое, поэтому в моем ответе не будет формы, которые содержатся в class Ui_MainWindow(object):
и части формы, которые содержатся в class Ui_Form(object):.


import sys
import os
import subprocess
import requests
from PyQt5 import QtCore, QtGui, QtWidgets             # !!! ваши импорты для PySide6 
from PyQt5.Qt import *                                 # !!! ваши импорты для PySide6 


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):

    # ... сюда вставьте                      <----<----<----<----<----


# !!! TaskWidget
class TaskWidget(QWidget):
    '''           Signal                      для PySide6      !!!!!!!!!!!!
    itemDeleted = Signal(QListWidgetItem)
    itemEdited = Signal(QListWidgetItem)
    itemStarted = Signal(QListWidgetItem)
    itemStopped = Signal(QListWidgetItem)
    '''
# установите свое ^^^^^^
# уберите    мое  vvvvvvvvvv   
#                 pyqtSignal                   для PyQt5       !!!!!!!!!!!!
    itemDeleted = pyqtSignal(QListWidgetItem)
    itemEdited = pyqtSignal(QListWidgetItem)
    itemStarted = pyqtSignal(QListWidgetItem)
    itemStopped = pyqtSignal(QListWidgetItem)

    def __init__(self, item, data, *args, **kwargs):
        super(TaskWidget, self).__init__(*args, **kwargs)
        self._item = item
        self.num_row = QLabel(self)
        self.num_row.setObjectName(u"num_row")
        self.num_row.setGeometry(QRect(9, 9, 24, 24))
        self.num_row.setAlignment(Qt.AlignCenter)
        self.site_row = QLabel(self)
        self.site_row.setObjectName(u"site_row")
        self.site_row.setGeometry(QRect(50, 9, 91, 24))
        self.product_row = QLabel(self)
        self.product_row.setObjectName(u"product_row")
        self.product_row.setGeometry(QRect(150, 9, 161, 24))
        self.size_row = QLabel(self)
        self.size_row.setObjectName(u"size_row")
        self.size_row.setGeometry(QRect(330, 9, 61, 24))
        self.profile_row = QLabel(self)
        self.profile_row.setObjectName(u"profile_row")
        self.profile_row.setGeometry(QRect(405, 9, 81, 24))
        self.proxy_row = QLabel(self)
        self.proxy_row.setObjectName(u"proxy_row")
        self.proxy_row.setGeometry(QRect(500, 9, 60, 24))
        self.status_row = QLabel(self)
        self.status_row.setObjectName(u"status_row")
        self.status_row.setGeometry(QRect(580, 9, 191, 24))
        self.status_row.setAlignment(Qt.AlignCenter)
        self.start_row = QPushButton(self)
        self.start_row.setObjectName(u"start_row")
        self.start_row.setGeometry(QRect(781, 6, 26, 26))
        icon1 = QIcon()
        icon1.addFile(u"img/start.png", QSize(), QIcon.Normal, QIcon.Off)
        self.start_row.setIcon(icon1)
        self.start_row.setIconSize(QSize(26, 26))
        self.stop_row = QPushButton(self)
        self.stop_row.setObjectName(u"stop_row")
        self.stop_row.setGeometry(QRect(820, 6, 26, 26))
        icon2 = QIcon()
        icon2.addFile(u"img/stop.png", QSize(), QIcon.Normal, QIcon.Off)
        self.stop_row.setIcon(icon2)
        self.stop_row.setIconSize(QSize(26, 26))
        self.edit_row = QPushButton(self)
        self.edit_row.setObjectName(u"edit_row")
        self.edit_row.setGeometry(QRect(860, 6, 26, 26))
        icon3 = QIcon()
        icon3.addFile(u"img/pen.png", QSize(), QIcon.Normal, QIcon.Off)
        self.edit_row.setIcon(icon3)
        self.edit_row.setIconSize(QSize(26, 26))
        self.delete_row = QPushButton(self)
        self.delete_row.setObjectName(u"delete_row")
        self.delete_row.setGeometry(QRect(900, 6, 26, 26))

        self.start_row.clicked.connect(self.startItem)
        self.stop_row.clicked.connect(self.stopItem)
        self.delete_row.clicked.connect(self.deleteItem)
        self.edit_row.clicked.connect(self.editItem)
        icon4 = QIcon()
        icon4.addFile(u"img/trash.png", QSize(), QIcon.Normal, QIcon.Off)
        self.delete_row.setIcon(icon4)
        self.delete_row.setIconSize(QSize(26, 26))
        self.num_row.setText(QCoreApplication.translate("MainWindow", data['num'], None))
        self.site_row.setText(QCoreApplication.translate("MainWindow", data['site'], None))
        self.product_row.setText(QCoreApplication.translate("MainWindow", data['product'], None))
        self.size_row.setText(QCoreApplication.translate("MainWindow", data['size'], None))
        self.profile_row.setText(QCoreApplication.translate("MainWindow", data['profile'], None))
        self.proxy_row.setText(QCoreApplication.translate("MainWindow", data['proxy'], None))
        self.status_row.setText(QCoreApplication.translate("MainWindow", data['status'], None))
        self.status_row.setStyleSheet(f"color: {data['color']}")

    def deleteItem(self):
        self.itemDeleted.emit(self._item)

    def editItem(self):
        self.itemEdited.emit(self._item)

    def startItem(self):
        self.itemStarted.emit(self._item)

    def stopItem(self):
        self.itemStopped.emit(self._item)


class Ui_Form(object):

    # ... сюда вставьте          <----<----<----<----<----<----<----

    def retranslateUi(self, Form):
        Form.setWindowTitle(QCoreApplication.translate("Form", u"Centurion AIO", None))
        self.left_back.setText("")
        self.right_back.setText("")
        self.enter_your_label.setText(QCoreApplication.translate("Form", u"Enter your license key:", None))
        self.response_text.setText(QCoreApplication.translate("Form", u"", None))
        self.input_key.setPlaceholderText(QCoreApplication.translate("Form", u"license key", None))
        try:
            with open('upls\key.txt', 'r') as key:
                key1 = key.readlines()[0]
        except:
            pass
        else:
            self.input_key.setText(QCoreApplication.translate("Form", str(key1), None))
        self.loginButton.setText(QCoreApplication.translate("Form", u"Log In", None))
        self.exit_button.setText(QCoreApplication.translate("Form", u"X", None))


class MoveStartWindow(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)

        self.old_pos = None
        
        self.exit_button.clicked.connect(lambda: self.close())
        self.loginButton.clicked.connect(self.check_status)        
        
    def check_status(self):
        print(self.input_key.text())
        self.main_window()

    def get_id(self):
        current_machine_id = str(subprocess.check_output('wmic csproduct get uuid'), 'utf-8').split('\n')[1].strip()
        return current_machine_id

    def main_window(self):
        headers = {
            'Content-type': 'application/json'
        }
        data = {
            "key": self.input_key.text(),
            "device": self.get_id(),
            "id": "604a002dd52644b19441776d",
        }

        r = requests.post(
            'https://api.cactusweb.io/api/v1/devices', 
            headers=headers, 
            json=data
        )
        if r.status_code == 400:
            self.response_text.setStyleSheet(u"color: rgb(255, 0, 0);")
            self.response_text.setText(QCoreApplication.translate("Form", u"Access Denied", None))
        elif r.status_code == 202:
            self.response_text.setStyleSheet(u"color: rgb(0, 170, 0);")
            self.response_text.setText(QCoreApplication.translate("Form", u"Logged succsefully", None))
            os.system('cls')
        elif r.status_code == 200:
            self.response_text.setStyleSheet(u"color: rgb(0, 170, 0);")
            self.response_text.setText(QCoreApplication.translate("Form", u"Logged succsefully", None))
            # Create the Qt Application
            self.main_form = QMainWindow()
            # Create and show the form
            license_key_not_found = False
            try:
                with open('upls\key.txt', 'r') as lickey:
                    lickey1 = lickey.readlines()
                    license_key = lickey1[0]
                if license_key != self.input_key.text():
                    write_key = open('upls\key.txt', 'w')
                    write_key.write(self.input_key.text())
                    write_key.close()
            except:
                license_key_not_found = True
                write_key = open('upls\key.txt', 'w')
                write_key.write(self.input_key.text())
                write_key.close()

#            self.mainWindow = Ui_MainWindow()
#            self.mainWindow.setupUi(self.main_form)
#            self.main_form.show()

            self.mainWindow = MainWindow()                             # +++
            self.mainWindow.show()                                     # +++
            self.hide()                                                # +++
        
        os.system('cls')
        
    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 MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):                # !!!
    def __init__(self):
        super().__init__()
        self.setupUi(self)                                             # !!!
        
        self.tabs_widget.setCurrentIndex(1)
# ???        self.pos = self.pos()

        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.exit_button.clicked.connect(lambda: self.close())
        self.hide_button.clicked.connect(lambda: self.showMinimized())
        
#        self.app_core(self)   
        self.app_core()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        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)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def app_core(self):                                 
# ???        self.pos = self.pos()

        self.tasks_num = 0
        
        self.set_containers()
        self.update_comboboxes('proxy')
        self.update_comboboxes('profiles')
        
        self.task_creator.clicked.connect(lambda: self.tabs_widget.setCurrentIndex(0))
        self.tasks.clicked.connect(lambda: self.tabs_widget.setCurrentIndex(1))

        self.billing.clicked.connect(self.show_profiles_tab)
        self.proxies.clicked.connect(self.show_proxy_tab)
        self.settings.clicked.connect(self.show_settings_tab)

        self.save_settings_button.clicked.connect(self.save_settings)
        self.create_proxy_button.clicked.connect(self.add_proxy)
        self.create_profile_button.clicked.connect(self.add_profile)
        # self.test_webhook_button.clicked.connect(self.send_test_webhook)
        self.add_taskBtn.clicked.connect(self.add_task)
        self.enter_site_combo.currentTextChanged.connect(self.check_combobox)

    def start_task(self, item):
        for i in self.tasks_container:
            if self.tasks_container[i]['item'] == item:
                data = self.tasks_container[i]
                break
        if data['site'] == 'Aliexpress':
            self.active_tasks.append((item, Aliexpress(data, self.settings_container)))
        elif data['site'] == 'Basketshop':
            self.active_tasks.append((item, Basketshop(data, self.settings_container)))
        elif data['site'] == 'Svyaznoy':
            self.active_tasks.append((item, Svyaznoy(data, self.settings_container)))
        elif data['site'] == 'Sneakerhead':
            self.active_tasks.append((item, Sneakerhead(data, self.settings_container)))
        elif data['site'] == 'Brandshop':
            self.active_tasks.append((item, Brandshop(data, self.settings_container)))
        elif data['site'] == 'Wildberries':
            self.active_tasks.append((item, WbBot(data, self.settings_container)))
        elif data['site'] == 'BrandshopAccGen':
            self.active_tasks.append((item, BrandshopAccGen(data, self.settings_container)))
        elif data['site'] == 'BeliefMoscow':
            self.active_tasks.append((item, BeliefMoscow(data, self.settings_container)))
        elif data['site'] == 'EldoradoFormReg':
            print(1)
            # self.active_tasks.append((item, EldoradoFormReg(data, self.settings_container)))
        else:
            print(data['site'])
        self.active_tasks[-1][1].send_status.connect(lambda info: self.set_status(info, i))
        self.active_tasks[-1][1].stop_task.connect(self.stop_task)
        self.active_tasks[-1][1].setTerminationEnabled(True)
        self.active_tasks[-1][1].start()

    def set_status(self, info: dict, i):
        data = self.tasks_container[i]
        data['status'] = info['status']
        data['color'] = info['color']
        self.change_data(i, data)

    def stop_task(self, item):
        try:
            self.active_tasks[-1][1].stop()
        except:
            pass
        for i in self.tasks_container:
            if self.tasks_container[i]['item'] == item:
                break
        for j in range(len(self.active_tasks)):
            if self.active_tasks[j] == item:
                break
        self.active_tasks.pop(j)
        info = {'status': 'Stop', 'color': 'red'}
        self.set_status(info, i)

    def add_proxy(self):
        data = dict()

        self.proxies_container[self.proxy_input.toPlainText()] = data
        self.update_comboboxes('proxy')

        self.create_proxy_indicator.show()

    def check_combobox(self):
        data = dict()
        data['site'] = self.enter_site_combo.currentText()

        if data['site'] == "Aliexpress":
            data['cookie'] = self.enter_cookie_combo.hide()
            data['cookie'] = self.enter_cookie_label.hide()
            data['size'] = self.enter_size_combo.hide()
            data['size'] = self.enter_size_label.hide()
            data['test'] = self.enter_test_input.hide()
            data['test'] = self.enter_test_label.hide()
            self.size_frame.setMinimumSize(QSize(0, 0))
            self.size_frame.setMaximumSize(QSize(0, 0))
            self.cookie_frame.setMinimumSize(QSize(0, 0))
            self.cookie_frame.setMaximumSize(QSize(0, 0))

        elif data['site'] == "Basketshop":
            data['test'] = self.enter_test_input.hide()
            data['test'] = self.enter_test_label.hide()
            data['cookie'] = self.enter_cookie_combo.show()
            data['cookie'] = self.enter_cookie_label.show()
            data['size'] = self.enter_size_combo.show()
            data['size'] = self.enter_size_label.show()
            self.size_frame.setMinimumSize(QSize(944, 70))
            self.size_frame.setMaximumSize(QSize(944, 70))
            self.cookie_frame.setMinimumSize(QSize(944, 60))
            self.cookie_frame.setMaximumSize(QSize(944, 60))

        elif data['site'] == "Svyaznoy":
            data['test'] = self.test_frame.show()
            data['test'] = self.enter_test_input.show()
            data['test'] = self.enter_test_label.show()

    def add_profile(self):
        data = dict()
        if self.profile_name_input.text() != '':
            self.profiles_container[self.profile_name_input.text()] = data
            self.update_comboboxes('profiles')
        if self.skip1_name_input.text() != '':
            self.skip_container[self.skip1_name_input.text()] = data
            self.update_comboboxes('skips')
        if self.cookie1_name_input.text() != '':
            self.cookie_container[self.cookie1_name_input.text()] = data
            self.update_comboboxes('cookie')

        self.create_profile_indicator.show()

    """def send_test_webhook(self):
        embed1 = Webhook(self.settings_container['webhook'], color=0x6dff1f)
        embed1.set_footer(text='Centurion AIO ©', ts=False)
        embed1.post()"""

    def save_settings(self):
        self.settings_container['webhook'] = self.webhook_input.text()
        self.settings_container['2captcha'] = self.captcha_input.text()
        self.settings_container['onlinesim'] = self.onlinesim_input.text()
        f = open('upl\settings.txt', 'w')
        f.close()
        with open('upl\settings.txt', 'a') as e:
            e.write(self.settings_container['webhook'] + '\n' + self.settings_container['2captcha'] + '\n' +
                    self.settings_container['onlinesim'])
        self.save_indicator.show()

    def add_task(self):
        data = dict()
        self.tasks_num += 1
        data['num'] = str(self.tasks_num)
        data['site'] = self.enter_site_combo.currentText()
        data['profile'] = self.enter_profile_combo.currentText()
        data['product'] = self.enter_product_input.text()
        data['size'] = self.enter_size_combo.text()
        data['skip'] = self.enter_skip_combo.currentText()
        data['cookie'] = self.enter_cookie_combo.currentText()
        data['test'] = self.enter_test_input.text()
        if data['size'] == '':
            data['size'] = 'No Size'
        data['proxy'] = self.proxy_input.toPlainText()
        data['keyword'] = self.enter_keyword_input.text()
        item = QListWidgetItem(self.listWidget)
        item.setSizeHint(QSize(944, 40))
        data['item'] = item
        print(data['item'])
        data['color'] = 'red'
        data['status'] = 'Stop'
        
# !!!            TaskWidget
        widget = TaskWidget(item, data)
        
        widget.itemDeleted.connect(self.deleteTask)
        widget.itemEdited.connect(self.editTask)
        widget.itemStarted.connect(self.start_task)
        widget.itemStopped.connect(self.stop_task)
        # Binding delete signal
        self.listWidget.setItemWidget(item, widget)
        self.tasks_container[self.tasks_num] = data
        del data

    def deleteTask(self, item):
        self.tasks_num -= 1
        row = self.listWidget.indexFromItem(item).row()
        item = self.listWidget.takeItem(row)
        self.listWidget.removeItemWidget(item)
        del item

    def editTask(self, item):
        for t in self.tasks_container:
            if self.tasks_container[t]['item'] == item:
                break

        dialog = Ui_Dialog(self.tasks_container[t], self.profiles_container, self.proxies_container,
                           self.skip_container, self.cookie_container)
        dialog.itemEdit.connect(lambda data: self.change_data(t, data))

        center = QScreen.availableGeometry(QApplication.primaryScreen()).center()
        dialog.move(center.x() - 400, center.y() - 275)
        if dialog.exec() == QDialog.Accepted:
            print('edited')
        else:
            print('cancelled')

    def change_data(self, i, data):
        row = self.listWidget.indexFromItem(data['item']).row()
        item = self.listWidget.takeItem(row)
        self.listWidget.removeItemWidget(item)

        self.listWidget.insertItem(row, data['item'])
# !!!            TaskWidget        
        widget = TaskWidget(data['item'], data)
        
        widget.itemDeleted.connect(self.deleteTask)
        widget.itemEdited.connect(self.editTask)
        widget.itemStarted.connect(self.start_task)
        widget.itemStopped.connect(self.stop_task)
        self.listWidget.setItemWidget(data['item'], widget)
        self.tasks_container[i] = data

    def update_comboboxes(self, tab):
        if tab == 'profiles':
            names = list(self.profiles_container.keys())
            count = self.enter_profile_combo.count()
            for i in range(count):
                self.enter_profile_combo.removeItem(0)
            for i in range(len(names)):
                self.enter_profile_combo.addItem(names[i])
        elif tab == 'skips':
            names = list(self.skip_container.keys())
            count = self.enter_skip_combo.count()
            for i in range(count):
                self.enter_skip_combo.removeItem(0)
            for i in range(len(names)):
                self.enter_skip_combo.addItem(names[i])
        elif tab == 'cookie':
            names = list(self.cookie_container.keys())
            count = self.enter_cookie_combo.count()
            for i in range(count):
                self.enter_cookie_combo.removeItem(0)
            for i in range(len(names)):
                self.enter_cookie_combo.addItem(names[i])

    def set_containers(self):
        self.tasks_container = dict()
        self.profiles_container = {'No accounts': {}}
        self.proxies_container = {'Local': {}}
        self.skip_container = {'No Skip': {}}
        self.cookie_container = {'No Cookie': {}}
        self.settings_container = dict()
        self.active_tasks = list()
        self.save_settings()
        # FIXME: добавить загрузку данных из реестра

    def show_settings_tab(self):
        self.save_indicator.hide()
        self.tabs_widget.setCurrentIndex(3)

    def show_proxy_tab(self):
        self.create_proxy_indicator.hide()
        self.tabs_widget.setCurrentIndex(4)

    def show_profiles_tab(self):
        self.create_profile_indicator.hide()
        self.tabs_widget.setCurrentIndex(2)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MoveStartWindow()                                           # !!! 
    w.show()                                                        # !!!
    sys.exit(app.exec())

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

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

→ Ссылка