Найти - Пользователи
Полная версия: QTableWidgetItem
Начало » Python для новичков » QTableWidgetItem
1 2
ROBOT-3000
Здравствуйте помогите новичку. Задача выровнять иконку по центру ячейки таблицы.
    def on_clicked_btn(self):
_item = QtGui.QTableWidgetItem(QtGui.QIcon(self._ICON_), "D")


self.table.setItem(self.table.currentRow(), self.table.currentColumn(), _item)
Так я загоняю иконку в ячейку и она становиться с левой стороны а буква “D” с правой.
Надо на оборот.
ROBOT-3000
Помогите ребята! я мучаюсь уже очень долго!
Текст выравниваю вот так _item.setTextAlignment(QtCore.Qt.AlignCenter)
Все работает. А иконка как мертвая.
На документацию смотреть уже не могу.
Примеры в доке еще и на C++ написаны в котором не бум бум, не смотря на это все равно подходящего
решения не нашел. Гугл тоже результата не дал.
Господа гуру помогите!
Rodegast
> Надо на оборот.

“На оборот” QTableWidget не умеет. Если хочешь управлять отрисовкой ячеек, то используй QTableView с соответствующий делигатой.
ROBOT-3000
Спасибо за ответ, не могли бы дать пример где это реализовано?
Очень нужно, пишу программу для вязания, а это основной функционал, еще бы понять можно ли растянуть иконку на всю ячейку.
Я в делегатах не разбираюсь, гуглил примеры но там на С++ примеры с делегатами что вообще темный лес.
Мне бы этот конкретный примерчик на питоне.
PEHDOM
как вариант можно напсать свой “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 например..
Rodegast
> можно напсать свой TableWidgetItem с преферансом и стюардессами

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

ROBOT-3000 если не хочешь мучится с делегатами, то размести текст и графику в разных ячейках, если это не вариант, то приведи пример того что у тебя должно быть.
ROBOT-3000
Ого крутяк! Спасибо огромное! буду пилить с удовольствием!
Мне текст в ячейке вообще не нужен, нужна только иконка на всю ячейку, я пишу программу создания схемы для вязания, иконки это символы.
ROBOT-3000
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() то ячейки становятся обычными и все норм работает. Но мне не нужны широкие ячейки.
Что я не так делаю? Буду конечно разбираться сам но и от помощи не откажусь.
PEHDOM
то потому что у вас 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
ROBOT-3000
Вот прикрепил скриншот, там показана палочка стоит не ровно по центру. Margins выставил по нулям.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB