Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2024, 11:07   #1
python_alex
Новичок
Джуниор
 
Регистрация: 16.07.2024
Сообщений: 2
По умолчанию Потоки и вставка виджета

Добрый день!
Столкнулся с такой проблемой, через поток не хочет вставляться виджет (кнопка) в таблицу ListGrease. Помогите решить этот вопрос, спасибо!

Код:
from form_main import Ui_MainWindow
from PyQt6 import QtWidgets, QtCore
from PyQt6.QtWidgets import (
    QApplication, QMainWindow, QTableWidgetItem
)
import sys
import time
import threading
class Window_main_form(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.potok1)
        self.pushButton_2.clicked.connect(self.potok2)
    def Timer(self):
        st = 0
        while True:
            time.sleep(0.3)
            win_main_form.lineEdit.setText(str(st))
            st += 1
    def potok1(self):
        thread = threading.Thread(target=self.Timer, daemon=True)
        thread.start()
    def potok2(self):
        thread = threading.Thread(target=self.potok2_2, daemon=True)
        thread.start()
    def potok2_2(self):
        self.ListGrease.setColumnCount(2)
        self.ListGrease.setRowCount(0)
        self.ListGrease.setHorizontalHeaderLabels(["-", "Дата"])
        self.ListGrease.resizeColumnsToContents()
        self.ListGrease.resizeColumnsToContents()
        self.ListGrease.setRowCount(self.ListGrease.rowCount() + 1)
        self.ListGrease.setRowCount(self.ListGrease.rowCount() + 1)
        self.ListGrease.setItem(0, 1, QTableWidgetItem(str("Текст")))
        pushButton = QtWidgets.QPushButton('X')
        pushButton.setMaximumSize(QtCore.QSize(35, 25))
        pushButton.clicked.connect(self.clik)
        self.ListGrease.setCellWidget(1, 0, QTableWidgetItem(pushButton)) # вот здесь ошибка
    def clik(self):
        print("Клик!")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    win_main_form = Window_main_form()
    win_main_form.show()
    sys.exit(app.exec())
python_alex вне форума Ответить с цитированием
Старый 16.07.2024, 16:55   #2
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 212
По умолчанию

Во-первых, у класса QTableWidgetItem нет конструктора с такими аргументами (см. https://doc.qt.io/qt-6/qtablewidgetitem.html )

Во-вторых, метод setCellWidget у QTableWidget определён как
void setCellWidget(int row, int column, QWidget *widget) ,
значит надо
self.ListGrease.setCellWidget(1, 0, pushButton)
( https://doc.qt.io/qt-6/qtablewidget.html )

В-третьих, локальную кнопку pushButton лучше назвать по-другому, потому что уже есть член класса с таким именем.
DeepFlake вне форума Ответить с цитированием
Старый 17.07.2024, 10:09   #3
python_alex
Новичок
Джуниор
 
Регистрация: 16.07.2024
Сообщений: 2
По умолчанию

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
Во-первых, у класса QTableWidgetItem нет конструктора с такими аргументами (см. https://doc.qt.io/qt-6/qtablewidgetitem.html )

Во-вторых, метод setCellWidget у QTableWidget определён как
void setCellWidget(int row, int column, QWidget *widget) ,
значит надо
self.ListGrease.setCellWidget(1, 0, pushButton)
( https://doc.qt.io/qt-6/qtablewidget.html )

В-третьих, локальную кнопку pushButton лучше назвать по-другому, потому что уже есть член класса с таким именем.
Спасибо за ответ, но после внесения всех исправлений, все ровно не работает.
python_alex вне форума Ответить с цитированием
Старый 17.07.2024, 15:24   #4
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 212
По умолчанию

>все ровно не работает.

посмотрел на программу и возникли такие вопросы:
1. в качестве процедур потока используются методы класса. А это хорошая идея? Может быть лучше использовать статические методы?

2. я слабо разбираюсь в Qt6, но знаю, что в других библиотеках для создания графического пользовательского интерфейса просто так работать с оконными элементами из потоков нельзя, а надо использовать синхронизацию с основным GUI-потоком, который обрабатывает события.
DeepFlake вне форума Ответить с цитированием
Старый 17.07.2024, 18:25   #5
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 377
По умолчанию

Цитата:
Сообщение от python_alex Посмотреть сообщение
Добрый день!
Столкнулся с такой проблемой, через поток не хочет вставляться виджет (кнопка) в таблицу ListGrease. Помогите решить этот вопрос, спасибо!

Код:
from form_main import Ui_MainWindow
from PyQt6 import QtWidgets, QtCore
from PyQt6.QtWidgets import (
    QApplication, QMainWindow, QTableWidgetItem
)
import sys
import time
import threading
class Window_main_form(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.potok1)
        self.pushButton_2.clicked.connect(self.potok2)
    def Timer(self):
        st = 0
        while True:
            time.sleep(0.3)
            win_main_form.lineEdit.setText(str(st))
            st += 1
    def potok1(self):
        thread = threading.Thread(target=self.Timer, daemon=True)
        thread.start()
    def potok2(self):
        thread = threading.Thread(target=self.potok2_2, daemon=True)
        thread.start()
    def potok2_2(self):
        self.ListGrease.setColumnCount(2)
        self.ListGrease.setRowCount(0)
        self.ListGrease.setHorizontalHeaderLabels(["-", "Дата"])
        self.ListGrease.resizeColumnsToContents()
        self.ListGrease.resizeColumnsToContents()
        self.ListGrease.setRowCount(self.ListGrease.rowCount() + 1)
        self.ListGrease.setRowCount(self.ListGrease.rowCount() + 1)
        self.ListGrease.setItem(0, 1, QTableWidgetItem(str("Текст")))
        pushButton = QtWidgets.QPushButton('X')
        pushButton.setMaximumSize(QtCore.QSize(35, 25))
        pushButton.clicked.connect(self.clik)
        self.ListGrease.setCellWidget(1, 0, QTableWidgetItem(pushButton)) # вот здесь ошибка
    def clik(self):
        print("Клик!")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    win_main_form = Window_main_form()
    win_main_form.show()
    sys.exit(app.exec())
Код:
from form_main import Ui_MainWindow
from PyQt6 import QtWidgets, QtCore
from PyQt6.QtWidgets import (
    QApplication, QMainWindow, QTableWidgetItem
)
import sys
import time
import threading
class Window_main_form(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.potok1)
        self.pushButton_2.clicked.connect(self.potok2)
    def Timer(self):
        st = 0
        while True:
            time.sleep(0.3)
            win_main_form.lineEdit.setText(str(st))
            st += 1
    def potok1(self):
        thread = threading.Thread(target=self.Timer, daemon=True)
        thread.start()
    def potok2(self):
        thread = threading.Thread(target=self.potok2_2, daemon=True)
        thread.start()
    def potok2_2(self):
        self.ListGrease.setColumnCount(2)
        self.ListGrease.setRowCount(0)
        self.ListGrease.setHorizontalHeaderLabels(["-", "Дата"])
        self.ListGrease.resizeColumnsToContents()
        self.ListGrease.resizeColumnsToContents()
        self.ListGrease.setRowCount(self.ListGrease.rowCount() + 1)
        self.ListGrease.setRowCount(self.ListGrease.rowCount() + 1)
        
        # Создаем объект QTableWidgetItem с настроенным свойством widget
        item = QTableWidgetItem()
        item.setFlags(item.flags() ^ QtCore.Qt.ItemFlag.ItemIsEditable)  # Делаем элемент нередактируемым
        pushButton = QtWidgets.QPushButton('X')
        pushButton.setMaximumSize(QtCore.QSize(35, 25))
        pushButton.clicked.connect(self.clik)
        item.widget = pushButton
        
        # Устанавливаем элемент в ячейку таблицы
        self.ListGrease.setItem(1, 0, item)
    def clik(self):
        print("Клик!")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    win_main_form = Window_main_form()
    win_main_form.show()
    sys.exit(app.exec())
MakarovDs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение виджета WP Vovk@Krut WordPress и другие CMS 1 12.08.2020 19:13
Открывается два виджета одновременно dimaSlon Qt и кроссплатформенное программирование С/С++ 0 14.05.2018 15:53
Создание виджета ilshat09 JavaScript, Ajax 5 08.04.2015 14:41
определение виджета вова4 Qt и кроссплатформенное программирование С/С++ 5 31.07.2014 19:56
Доведение до ума виджета Unique HTML и CSS 2 25.04.2011 08:39