我是Python的新手,甚至更新于PyQt.我设法创建了一个表,但想在某些单元格中添加图像.我已经读过,我需要继承QTableWidget类,或者可能是QTableWidgetItem类,并重新实现QPaintEvent.如果有人有重新实现QPaintEvent的例子,我会非常感激.
谢谢,斯蒂芬
我正在使用PyQt开发GUI.GUI有一个qListWidget,一个qTableWidget和一个用Mayavi实现的图.列表指的是绘制的形状(例如圆柱和圆锥).当在列表中选择一个形状时,我希望将形状的属性加载到表中(从字典变量中)和要在图中突出显示的形状.我有Mayavi密谋工作正常.此外,如果编辑了表格,我需要重新绘制形状,以反映新的属性值(如圆柱体,如果半径已更改).
因此,当选择列表项时 - >使用项的属性(从字典变量)更新表,突出显示项目上的项目
编辑表时 - >更新字典变量并重新绘制项目
问题:当我选择一个列表项并将数据加载到表中时,每次更新单元格时都会触发qTableWidget ItemChanged信号,这会触发不完整数据重新绘制形状的次数.
在以编程方式更新表时,是否存在禁用GUI事件循环的典型方法?(我有使用Excel VBA的经验,在该上下文中设置Application.EnableEvents = False将阻止每次以编程方式更新单元格时触发WorksheetChange事件.)我是否应该有一个"表更新进行中"变量以防止在执行操作时采取操作表正在更新?有没有办法一次更新Table Widget而不是逐项更新?(我承认我现在故意避开模型 - 视图框架,因此qListWIdget和qTableWidget).
有什么建议?
我是第一次发布海报,但却是StackOverflow的长期用户,所以我只是想提前感谢这样一个非常棒的社区!
我有一个主窗口与在QToolBar,QWidget的和QTabWidget.布局是"网格".但是,我的窗口可以调整大小,因为我有一个布局,它运行良好.但是有一个问题,在我的QTabWidget中我有一个带有两列的QTableWidget(布局也是"Grid").如果我调整整个窗口的大小,QTableWidget会调整大小,但不会调整列.
例如,每当我调整窗口大小时,我的QTabWidget也会调整其大小和QTableWidget.只有我的QTableWidget中的列不会.
那么......如果我的QTableWidget调整大小,我怎么能调整它们的大小呢?
我想强调鼠标悬停在我的行上QTableWidget.
当我悬停鼠标时,只突出显示单个单元格.
我试过这种方法:
bool MyTabWidget::eventFilter(QObject *target, QEvent *event)
{
if( target == ui->MyTableWidget )
{
//Just to print the event type
qDebug() <<"EventType : "<<event->type();
}
}
Run Code Online (Sandbox Code Playgroud)
输出: EventType : 13.
`(13 = QEvent::Move)`
Run Code Online (Sandbox Code Playgroud)
我已经迷失了谷歌搜索.但没有得到任何适当的解决方案
有没有其他方法来满足我的要求(突出显示鼠标悬停的整行)?
请帮忙.预先感谢.
编辑:
请参考下面的屏幕截图更清晰.

这是我QTableWidget
想要在鼠标悬停时更改红色边框(已编辑)行的背景颜色.
我有一个可向其中动态添加QTableWidgets的滚动视图。但是,QTables本身也具有滚动条,因此不会显示完整表。有没有一种方法可以禁用滚动条,以便始终显示完整的表格?
编辑:我添加了
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
Run Code Online (Sandbox Code Playgroud)
按照建议。滚动条确实消失了,但是它仍然只显示部分表格(Ican可以在表格上悬停并使用鼠标滚轮进行滚动)。窗口小部件的代码如下
from PySide.QtGui import *
from PySide.QtCore import *
class MdTable(QTableWidget):
def __init__(self, data, depth, *args):
QTableWidget.__init__(self, *args)
self.hheaders = ["c1", "c2", "c3", "c4"]
self.depth = depth
self.bids = data
self.setData()
def setData(self):
self.setRowCount(self.depth)
self.setColumnCount(5)
for i in xrange(self.depth):
if len(self.data) > i:
d1= QTableWidgetItem(str(self.data[i][0]))
d2= QTableWidgetItem(str(self.data[i][1]))
self.setItem(i, 1, d1)
self.setItem(i, 2, d2)
self.setHorizontalHeaderLabels(self.hheaders)
self.verticalHeader().setVisible(False)
self.resizeRowsToContents()
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
Run Code Online (Sandbox Code Playgroud) 因此,我正在使用Python和PyQt,并创建了一个QTableWidget我用数据填充的。
有没有一种方法可以搜索特定的值,如果程序找到了某些东西,它可以返回coordinated(index)该项目的吗?
更新:
这是代码:
program2.py:
# -*- coding: utf-8 -*-
#imports:
import os
import platform
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import newchilddlg
from newchilddlg import *
from PyKDE4.kdeui import KDateComboBox
import xlrd
import xlwt
#version:
__version__ = "1.0.0"
#Main Window Class:
class MainWindow(QMainWindow):
#__init__ function:
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
#Window size:
self.resize(800,600)
self.centralwidget = QtGui.QWidget(self)
self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget)
#Table Widget:
self.tableWidget …Run Code Online (Sandbox Code Playgroud) 我知道如何将文本标签设置到行或列标题中。但我想做这样的事情:
https://i.stack.imgur.com/eMM6U.jpg
我没有找到任何有关如何在红色圆圈内进行操作的信息。我开始相信这不能用 QTableWidget 来完成。
谢谢 ;)
我有QTabWidget一个QTableWidget内部的,如下面的例子:
但是它在QTabWidget(图中标记为红色)中有一个“padding”(至少我认为是padding )。
如何删除它或扩展 QTableWidget 以填充 QTabWidget 区域?
我正在使用 Qt 5.3。
我有一个QTableWidget带有水平标题的 5 列。单击第 4 列的标题时,我需要启动一个函数。目前,我有一个可行的解决方案,它包括为单击的每个标题调用此函数,然后解析索引并测试它是否是正确的列。
这是当前的代码:
self.table = QtGuiWidgets.QTableWidget()
self.table.horizontalHeader().sectionClicked.connect(self.onHeaderClicked)
def onHeaderClicked(self, logicalIndex):
if logicalIndex == 4:
print "ok"
Run Code Online (Sandbox Code Playgroud)
有没有办法避免在每次单击标题时调用此函数,而只是在单击右列标题时调用它?
我有一个问题,Qt 中的文本删除在表格中过于激进,请参见图片。

带有完整数字0.8888的单元格......自从显示QTableWidget以来我已经进行了编辑,其他的与创建QTableWidget时一样。看起来 elide 是根据较小的宽度计算的,实际上也是如此。当小部件变得可见时,如何防止这种情况并立即删除正确的文本?
简化代码以重现:
QTableWidget *tableWidget;
tableWidget = new QTableWidget(Dialog);
tableWidget->setGeometry(QRect(40, 20, 256, 192));
tableWidget->setRowCount(4);
tableWidget->setColumnCount(1);
tableWidget->setItem(0, 0, new QTableWidgetItem("0.234823489789234"));
Run Code Online (Sandbox Code Playgroud)
和结果
请注意,我想避免自己进行删除,因为用户可以编辑该值。自己进行删除意味着在编辑开始时(也许通过委托)放回真正的值。会很复杂。
qtablewidget ×10
c++ ×5
pyqt ×5
python ×4
qt ×4
qt5 ×2
hover ×1
mouseevent ×1
pyqt4 ×1
pyside ×1
qtabwidget ×1
search ×1