Задать вопрос
@Sasha294

Как в QTableWidget подгрузить картинки из интернета, а не из папки?

Как в QTableWidget подгрузить картинки из интернета, а не из папки?
from PyQt5.QtWidgets import (QApplication, QMainWindow, QGridLayout, QWidget, 
                             QTableWidget, QTableWidgetItem, QPushButton, QHeaderView)
from PyQt5.QtCore    import QSize, Qt


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.setMinimumSize(QSize(480, 800))             
        self.setWindowTitle("Работа с QTableWidget")  

        central_widget = QWidget()                  
        self.setCentralWidget(central_widget)           

        grid_layout = QGridLayout()             
        central_widget.setLayout(grid_layout)   

        self.table = QTableWidget()  
        self.table.setColumnCount(4)     
        self.table.setRowCount(11111) 

        self.button = QPushButton("2000") 
        #self.button.move(350,170)
        self.button.clicked.connect(self.close)

        # Устанавливаем заголовки таблицы
        self.table.setHorizontalHeaderLabels(["2000", "2000", "2000","2000"])
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.table.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)                   

        # Устанавливаем всплывающие подсказки на заголовки
        self.table.horizontalHeaderItem(0).setToolTip("200")
        self.table.horizontalHeaderItem(1).setToolTip("200 ")
        self.table.horizontalHeaderItem(2).setToolTip("200")

        # Устанавливаем выравнивание на заголовки
        self.table.horizontalHeaderItem(0).setTextAlignment(Qt.AlignHCenter)
        self.table.horizontalHeaderItem(1).setTextAlignment(Qt.AlignHCenter)
        self.table.horizontalHeaderItem(2).setTextAlignment(Qt.AlignHCenter)
        self.table.horizontalHeaderItem(2).setTextAlignment(Qt.AlignHCenter)

        # заполняем первую строку
        self.table.setItem(0, 0, QTableWidgetItem("2000"))
        self.table.setItem(0, 1, QTableWidgetItem("2000"))
        self.table.setItem(4, 2, QTableWidgetItem("2000"))

        # делаем ресайз колонок по содержимому
        self.table.resizeColumnsToContents()

        grid_layout.addWidget(self.table,  0, 0)   # Добавляем таблицу в сетку
        grid_layout.addWidget(self.button, 0, 1)   # +++


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())
  • Вопрос задан
  • 646 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
sanya84
@sanya84
Фанатик Python 3
Только я не нашёл как установить размер ячейки под изображение
from io import BytesIO
import requests 
from PyQt5.QtWidgets import (QApplication, QMainWindow, QGridLayout,
                             QWidget, QTableWidget, QTableWidgetItem)
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtCore import QSize, Qt, QThread, pyqtSignal, pyqtSlot


class UploadImage(QThread):
    data = pyqtSignal(bytes)
    def __init__(self):
        super().__init__()
    @pyqtSlot()
    def run(self):

        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2)\
        AppleWebKit/537.36 (KHTML, like Gecko)\
        Chrome/63.0.3239.84 Safari/537.36',
        'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7'}

        url = "https://cdn.programiz.com/sites/tutorial2program/files/hello-world.jpg"

        try:
            content = requests.get(url, headers=headers).content
            self.data.emit(content)
        except requests.exceptions.ConnectionError as error:
            print(error)


class MainWindow(QMainWindow):
    # Переопределяем конструктор класса
    def __init__(self):
        # Обязательно нужно вызвать метод супер класса
        super().__init__()

        self.pixmap = QPixmap()

        self.setMinimumSize(QSize(800, 300))             # Устанавливаем размеры
        self.setWindowTitle("Загрузка изображения из интернета")# Устанавливаем заголовок окна

        central_widget = QWidget(self)                  # Создаём центральный виджет
        self.setCentralWidget(central_widget)           # Устанавливаем центральный виджет
 
        grid_layout = QGridLayout()             # Создаём QGridLayout
        central_widget.setLayout(grid_layout)   # Устанавливаем данное размещение в центральный виджет
 
        self.table = QTableWidget(self)  # Создаём таблицу

        self.table.setColumnCount(1)     
        self.table.setRowCount(1)        # и одну строку в таблице
 
        # Устанавливаем заголовки таблицы
        self.table.setHorizontalHeaderLabels(["Изображение"])
 
        # Устанавливаем всплывающие подсказки на заголовки
        self.table.horizontalHeaderItem(0)
        self.table.horizontalHeaderItem(0).setToolTip("Шутка")

        # Устанавливаем выравнивание на заголовки
        self.table.horizontalHeaderItem(0).setTextAlignment(Qt.AlignLeft)

        # делаем ресайз колонок по содержимому
        self.table.resizeColumnsToContents()
        grid_layout.addWidget(self.table, 0, 0)   # Добавляем таблицу в сетку

        self.upload_image = UploadImage()
        self.upload_image.start()
        self.upload_image.data.connect(self.show_image)

    def show_image(self, image_bytes):
        self.bytes_io = BytesIO(image_bytes)
        self.pixmap.loadFromData(self.bytes_io.getvalue())
        
        image = QTableWidgetItem()
        image.setData(Qt.DecorationRole, self.pixmap)
        image.setFlags(image.flags() ^ Qt.ItemIsEditable)
        
        self.table.setItem(0, 0, image)
        self.table.resizeColumnsToContents()
        
if __name__ == "__main__":
    import sys
 
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
02 февр. 2025, в 00:55
2500 руб./за проект
02 февр. 2025, в 00:25
5000 руб./за проект
02 февр. 2025, в 00:18
1000 руб./за проект