我是Python的新手,甚至更新于PyQt.我设法创建了一个表,但想在某些单元格中添加图像.我已经读过,我需要继承QTableWidget类,或者可能是QTableWidgetItem类,并重新实现QPaintEvent.如果有人有重新实现QPaintEvent的例子,我会非常感激.
谢谢,斯蒂芬
在QtCreater中,我在项目中添加了一个表.在我的代码中,我生成一些数据输出到表中.我想在QCheckbox
每行中添加一个以允许选择行.表的所有内容都左对齐,如何只将每行的第一列中的这些复选框与中心对齐?
我正在添加QCheckbox
使用:
ui->data_table->setCellWidget(rowCount,0, new QCheckBox);
Run Code Online (Sandbox Code Playgroud) 假设我有一个装满数据的二维数组,比如10 x 10.内容和行数可以随时改变.现在我想在QTableWidget中显示这些数据.
我使用超时1秒的计时器来刷新表格内容.如果我使用,在超时槽中
void slot_timeOut()
{
//Iterate over the rows
//and for each cell do something like
ui->tw_data->setItem(row, 0, new TableWidgetItem(data[row][0]);
ui->tw_data->setItem(row, 0, new TableWidgetItem(data[row][1]);
//...
ui->tw_data->setItem(row, 0, new TableWidgetItem(data[row][9]);
}
Run Code Online (Sandbox Code Playgroud)
使用新的TableWidgetItem让我很担心.我没有提及它,我从来没有删除它.
在一段时间内这是一个内存泄漏,或者由Qt管理,请帮助...
现在我可以处理QTableWidget
函数中的所有按键eventFilter()
(在myTable->viewport()->installEventFilter(this);
构造函数中调用之后).
在编辑时,唯一不起作用的地方是可编辑单元格(因为它会抓取所有按键).为了解决这个问题,我无法调用installEventFilter()
表中的每个项目,因为这些项目不是QObject
s(我也不能connect
用于处理按键处理).
我唯一的解决方案是将QLineEdit
s放在这些单元格中,并使用事件过滤器在编辑时捕获按键.但是,仅使用标准物品可以解决它吗?(即只QTableWidgetItem
带一面旗帜Qt::ItemIsEditable
)
我也可以打电话grabKeyboard()
给我QTableWidget
.在这种情况下,我将按下所有按键(即使在用户编辑单元格时),但它会阻止编辑框(即用户无法输入任何内容).可能是在调用grabKeyboard()
表后修复损坏的编辑框?
我有一个问题,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)
和结果
请注意,我想避免自己进行删除,因为用户可以编辑该值。自己进行删除意味着在编辑开始时(也许通过委托)放回真正的值。会很复杂。
代码:
populateTable()
{
tableWidget->clearContents();
tableWidget->setRowCount(stringList.size());
for(int i = 0; i < stringList.size(); ++i)
{
tableWidget->setItem(i, 0, new QTableWidgetItem(stringList.at(i)));
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
第一次运行populateTable(),一切都很好.但接下来的一段时间,它的运行速度明显慢于以前.
讨论:
仔细测试后,我怀疑clearContents()是问题所在.因为只需更改代码
tableWidget->clearContents();
Run Code Online (Sandbox Code Playgroud)
至:
tableWidget->setRowCount(0);
Run Code Online (Sandbox Code Playgroud)
解决问题,但现在又出现了另一个问题; 将行计数设置为'0'似乎不会删除堆分配的QTableWidgetItems,它似乎只是保留了项目的所有权,因此它会留下内存泄漏.(或者至少我只是这么认为......)
Qt在QTableWidget中的文档相当模糊,所以我并不确切知道clearContents()实际上做了什么.在文档中,它说"从视图中删除不在标题中的所有项目",这样我就会问,表中的内容是否只是隐藏?它会被删除吗?我不太确定.我的理论是clearContents()只隐藏项目,任何下一次填充表的尝试实际上删除并删除每个项目然后分配一个新的项目来设置在表格上,这反过来又是一项昂贵的操作.
另一件有趣的事情是Qt关于QTableWidget的文档表明填充QTableWidget的正确方法是在堆上分配一个QTableWidgetItem,然后将其设置在一个带有setItem()的表格单元格上,就像我在上面的代码中看到的那样,我发现它是奇怪...
综上所述:
是否有另一种方法来填充和重新填充Qt表而没有所有这些问题?如果没有,有没有办法解决这些问题?
我有使用qt设计器制作的自定义小部件,我想将它添加到QTableWidget单元格.但它不起作用.
这是代码:
int nRows =10;
for(int row = 0; row < nRows;row++;)
{
QTableWidgetItem* item = new QTableWidgetItem();
CustomWdg* wdg=new CustomWdg( );
mTableWdg->insertRow( row );
mTableWdg->setItem(row, 0, item);
mTableWdg->setCellWidget( row, 0, wdg );
}
Run Code Online (Sandbox Code Playgroud) 我试图在我的QTableWidget中插入和显示整数.它们不显示.它可以工作,如果我将所有内容转换为字符串,但我不能用数字排序列 - 只有词法(1,10,100等).这是使用PyQt.
我已经尝试了一些建议的解决方案,使用QTableWidgetItem.setData(someRole,intValue),然后在所有显示中都没有.我试过,Qt.UserRole,DisplayRole和Edit Role.(我不明白为什么需要这些角色来显示整数,但只是按照例子).我的具体代码是:
item = QTableWidgetItem()
item.setData = (Qt.DisplayRole,intValue)
myTable.setItem(row, column, item)
Run Code Online (Sandbox Code Playgroud)
以下代码有效,但仅适用于字符串:
item = QTableWidgetItem(str(intValue))
myTable.setItem(row, column, item)
Run Code Online (Sandbox Code Playgroud)
此外,回读数据的建议,只显示对象位置,而不是实际数据.例如,使用Eric作为解释器shell:
item.data(Qt.DisplayRole)
响应:PyQt4.QtCore.QVariant对象位于0x1f01fa60
或这个:
item.data(Qt.EditRole).数据()
响应:sip.voidptr对象位于0x1e904a80
任何见解都表示赞赏.
我创建了一个 QTableWidget,在其中的一列中,我使用 setCellWidget 函数设置组合框 QComboBox。效果很好。
这就是我设置 qtablewidget 的方式
cb = QComboBox()
cb.addItems(["Java", "C#", "Python"])
qtablewidget.setCellWidget(row_number, column_number , cb )
Run Code Online (Sandbox Code Playgroud)
但现在当我迭代 QTableWidget 时,我无法弄清楚如何获取每行组合框的选定值?
qtablewidgetitem ×10
qt ×7
qtablewidget ×7
c++ ×5
pyqt ×3
python ×3
integer ×1
pyqt5 ×1
qcheckbox ×1
qt-creator ×1
qt5 ×1