Форум сайта python.su
Здравствуйте помогите новичку. Задача выровнять иконку по центру ячейки таблицы.
def on_clicked_btn(self):
_item = QtGui.QTableWidgetItem(QtGui.QIcon(self._ICON_), "D")
self.table.setItem(self.table.currentRow(), self.table.currentColumn(), _item)
Офлайн
Помогите ребята! я мучаюсь уже очень долго!
Текст выравниваю вот так _item.setTextAlignment(QtCore.Qt.AlignCenter)
Все работает. А иконка как мертвая.
На документацию смотреть уже не могу.
Примеры в доке еще и на C++ написаны в котором не бум бум, не смотря на это все равно подходящего
решения не нашел. Гугл тоже результата не дал.
Господа гуру помогите!
Офлайн
> Надо на оборот.
“На оборот” QTableWidget не умеет. Если хочешь управлять отрисовкой ячеек, то используй QTableView с соответствующий делигатой.
Отредактировано Rodegast (Ноя. 29, 2016 09:59:59)
Офлайн
Спасибо за ответ, не могли бы дать пример где это реализовано?
Очень нужно, пишу программу для вязания, а это основной функционал, еще бы понять можно ли растянуть иконку на всю ячейку.
Я в делегатах не разбираюсь, гуглил примеры но там на С++ примеры с делегатами что вообще темный лес.
Мне бы этот конкретный примерчик на питоне.
Отредактировано ROBOT-3000 (Ноя. 29, 2016 11:26:27)
Офлайн
как вариант можно напсать свой “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_())
[code python][/code]
Отредактировано PEHDOM (Ноя. 29, 2016 11:57:33)
Офлайн
> можно напсать свой TableWidgetItem с преферансом и стюардессами
Да… мюсье знает толк в извращениях!
ROBOT-3000 если не хочешь мучится с делегатами, то размести текст и графику в разных ячейках, если это не вариант, то приведи пример того что у тебя должно быть.
Офлайн
Ого крутяк! Спасибо огромное! буду пилить с удовольствием!
Мне текст в ячейке вообще не нужен, нужна только иконка на всю ячейку, я пишу программу создания схемы для вязания, иконки это символы.
Отредактировано ROBOT-3000 (Ноя. 29, 2016 12:06:04)
Офлайн
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_())
Офлайн
то потому что у вас 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_())
[code python][/code]
Отредактировано PEHDOM (Ноя. 29, 2016 14:30:35)
Офлайн
Вот прикрепил скриншот, там показана палочка стоит не ровно по центру. Margins выставил по нулям.
Прикреплённый файлы: Безымянный3.png (32,7 KБ)
Офлайн