Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 27, 2016 17:00:09

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

QTableWidgetItem

Здравствуйте помогите новичку. Задача выровнять иконку по центру ячейки таблицы.

    def on_clicked_btn(self):
_item = QtGui.QTableWidgetItem(QtGui.QIcon(self._ICON_), "D")


self.table.setItem(self.table.currentRow(), self.table.currentColumn(), _item)
Так я загоняю иконку в ячейку и она становиться с левой стороны а буква “D” с правой.
Надо на оборот.

Офлайн

#2 Ноя. 28, 2016 12:25:53

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

QTableWidgetItem

Помогите ребята! я мучаюсь уже очень долго!
Текст выравниваю вот так _item.setTextAlignment(QtCore.Qt.AlignCenter)
Все работает. А иконка как мертвая.
На документацию смотреть уже не могу.
Примеры в доке еще и на C++ написаны в котором не бум бум, не смотря на это все равно подходящего
решения не нашел. Гугл тоже результата не дал.
Господа гуру помогите!

Офлайн

#3 Ноя. 29, 2016 09:59:42

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2823
Репутация: +  185  -
Профиль   Отправить e-mail  

QTableWidgetItem

> Надо на оборот.

“На оборот” QTableWidget не умеет. Если хочешь управлять отрисовкой ячеек, то используй QTableView с соответствующий делигатой.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Ноя. 29, 2016 09:59:59)

Офлайн

#4 Ноя. 29, 2016 11:21:32

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

QTableWidgetItem

Спасибо за ответ, не могли бы дать пример где это реализовано?
Очень нужно, пишу программу для вязания, а это основной функционал, еще бы понять можно ли растянуть иконку на всю ячейку.
Я в делегатах не разбираюсь, гуглил примеры но там на С++ примеры с делегатами что вообще темный лес.
Мне бы этот конкретный примерчик на питоне.

Отредактировано ROBOT-3000 (Ноя. 29, 2016 11:26:27)

Офлайн

#5 Ноя. 29, 2016 11:50:36

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

QTableWidgetItem

как вариант можно напсать свой “TableWidgetItem” с преферансом и стюардессами, небольшой пример:

 from PyQt4 import QtGui
import sys
class TableWidget(QtGui.QTableWidget):
    def __init__(self, parent=None):
        QtGui.QTableWidget.__init__(self, parent)
        rows, columns = 5, 5
        self._ICON_ = 'вписать сюда путь к картинке с иконкой'
        self.setColumnCount(columns)
        self.setRowCount(rows)
        self.show()
        for row in range(rows):
            for column in range(columns):
                item = TableWidgetItem(self._ICON_,""+str(row+1)+','+str(column+1))
                self.setCellWidget(row, column, item)
class TableWidgetItem(QtGui.QWidget):
    def __init__(self, icon, text):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QHBoxLayout(self)
        layout.setContentsMargins(0,0,0,0)
        layout.setSpacing(0)
        label1 = QtGui.QLineEdit()
        label1.setText(text)
        label1.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
        label1.setFrame(False)
        label2 = QtGui.QLabel()
        label2.setPixmap(QtGui.QPixmap(icon))
        layout.addWidget(label1)
        layout.addWidget(label2)
app = QtGui.QApplication(sys.argv)
t=TableWidget()
sys.exit(app.exec_())

Дальше пилите под ваши задачи, если вам не нужно редактировать текст в ячейках то заменяете QLineEdit на QLabel например..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Ноя. 29, 2016 11:57:33)

Офлайн

#6 Ноя. 29, 2016 12:02:18

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2823
Репутация: +  185  -
Профиль   Отправить e-mail  

QTableWidgetItem

> можно напсать свой TableWidgetItem с преферансом и стюардессами

Да… мюсье знает толк в извращениях!

ROBOT-3000 если не хочешь мучится с делегатами, то размести текст и графику в разных ячейках, если это не вариант, то приведи пример того что у тебя должно быть.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Ноя. 29, 2016 12:03:57

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

QTableWidgetItem

Ого крутяк! Спасибо огромное! буду пилить с удовольствием!
Мне текст в ячейке вообще не нужен, нужна только иконка на всю ячейку, я пишу программу создания схемы для вязания, иконки это символы.

Отредактировано ROBOT-3000 (Ноя. 29, 2016 12:06:04)

Офлайн

#8 Ноя. 29, 2016 13:12:03

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

QTableWidgetItem

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

from PyQt4.QtGui import *


class Icons(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.table = QtGui.QTableWidget(self)
self.table.setRowCount(50)
self.table.setColumnCount(50)
self.table.setGeometry(0, 29, 300, 400)
self.table.verticalHeader()
self.table.horizontalHeader()
self.table.show()
self._ICON_ = 'med1.png'
self.table.horizontalHeader().hide()
self.table.verticalHeader().hide()
# test
self.table.setColumnWidth(0, 30)
self.table.setRowHeight(0, 30)
self.table.resizeColumnsToContents()
#self.table.resizeRowsToContents()
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Icon')
#################################################################################
self.btn = QtGui.QPushButton("", self)
self.btn.setGeometry(0, 0, 80, 30), self.btn.sizeHint(), self.btn.resize(30, 30), self.btn.setIcon(QtGui.QIcon("ico.png"))
self.connect(self.btn, QtCore.SIGNAL("clicked()"), self.on_clicked_btn)
self.btn.show()
##################################################################################
def on_clicked_btn(self):
_item = TableWidgetItem(self._ICON_, "")
#_item.setTextAlignment(QtCore.Qt.AlignCenter)
self.table.setCellWidget(self.table.currentRow(), self.table.currentColumn(), _item)
##################################################################################

class TableWidgetItem(QtGui.QWidget):
def __init__(self, icon, text):
QtGui.QWidget.__init__(self)
layout = QtGui.QHBoxLayout(self)
layout.setContentsMargins(0, 0, 28, 0)
layout.setSpacing(0)
label1 = QtGui.QLabel()
label1.setText(text)
label1.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
label2 = QtGui.QLabel()
label2.setPixmap(QtGui.QPixmap(icon))
layout.addWidget(label1)
layout.addWidget(label2)




app = QtGui.QApplication(sys.argv)
qb = Icons()
qb.show()
sys.exit(app.exec_())
Код работает, но не так как надо, я делаю self.table.resizeColumnsToContents() для
того что бы ячейки были маленькой клеткой одного размера. Так когда помещаю туда картинку ее не видно. Если закоментировать self.table.resizeColumnsToContents() то ячейки становятся обычными и все норм работает. Но мне не нужны широкие ячейки.
Что я не так делаю? Буду конечно разбираться сам но и от помощи не откажусь.

Офлайн

#9 Ноя. 29, 2016 14:23:44

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

QTableWidgetItem

то потому что у вас layout.setContentsMargins(0, 0, 28, 0)
тоесть справа 28 пикселов пустого места, а выравнивание по правому краю. И соответвенно картинка “смещена” влево, а в видимой области у вас эти самые 28 пустых пискела.
нужно или сразу выставлять нужный размер ячеек или вызывать resizeColumnsToContents() каждый раз после клика кнопки.

 import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4.QtGui import *
class Icons(QtGui.QWidget):
    def __init__(self, parent=None):
           QtGui.QWidget.__init__(self, parent)
           self.table = QtGui.QTableWidget(self)
           self.table.setRowCount(50)
           self.table.setColumnCount(50)
           self.table.setGeometry(0, 29, 300, 400)
           self.table.verticalHeader()
           self.table.horizontalHeader()
           self.table.show()
           self._ICON_ = 'med1.png'
           self.table.horizontalHeader().hide()
           self.table.verticalHeader().hide()
        # test
           self.table.setColumnWidth(0, 30)
           self.table.setRowHeight(0, 30)
           self.table.resizeColumnsToContents()
           self.table.resizeRowsToContents()
           self.setGeometry(300, 300, 250, 150)
           self.setWindowTitle('Icon')
#################################################################################
           self.btn = QtGui.QPushButton("", self)
           self.btn.setGeometry(0, 0, 80, 30), self.btn.sizeHint(), self.btn.resize(30, 30), self.btn.setIcon(QtGui.QIcon("ico.png"))
           self.connect(self.btn, QtCore.SIGNAL("clicked()"), self.on_clicked_btn)
           self.btn.show()
##################################################################################
    def on_clicked_btn(self):
        _item = TableWidgetItem(self._ICON_, "")
        #_item.setTextAlignment(QtCore.Qt.AlignCenter)
        self.table.setCellWidget(self.table.currentRow(), self.table.currentColumn(), _item)
# подгоняем размер ячейки под содержимое
        self.table.resizeColumnToContents(self.table.currentColumn())
        self.table.resizeRowToContents(self.table.currentRow())
##################################################################################
class TableWidgetItem(QtGui.QWidget):
    def __init__(self, icon, text):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 28, 0)
        layout.setSpacing(0)
        label1 = QtGui.QLabel()
        label1.setText(text)
        label1.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
        label2 = QtGui.QLabel()
        label2.setPixmap(QtGui.QPixmap(icon))
        layout.addWidget(label1)
        layout.addWidget(label2)
app = QtGui.QApplication(sys.argv)
qb = Icons()
qb.show()
sys.exit(app.exec_())
ЗЫ если вам вообще текст не нужен томожете вообще уберать label1



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Ноя. 29, 2016 14:30:35)

Офлайн

#10 Ноя. 29, 2016 15:37:11

ROBOT-3000
Зарегистрирован: 2016-11-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

QTableWidgetItem

Вот прикрепил скриншот, там показана палочка стоит не ровно по центру. Margins выставил по нулям.

Прикреплённый файлы:
attachment Безымянный3.png (32,7 KБ)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version