我有一个QTableView与QSqlTableModel连接.
在第一列中,只有这种格式的日期:2010-01-02
我希望此列以此格式显示日期(但不更改实际数据):02.01.2010
我知道我必须为此列创建一个QItemDelegate,但我不知道我知道如何读取现有数据并用不同的东西覆盖它.你知道如何管理它吗?
我在Linux上使用Qt4.5.2.我有一个简单的QTableWidget,其中一列以人性化的格式显示日期.不幸的是,"人性化日期"并不容易正确排序.因此,在QTableWidget中,我保留一个隐藏列,其中包含与该日期对应的UNIX时间戳.
我试图确保,每当发出对DATE列进行排序的请求时,实际上在(不可见的)TIMESTAMP列上进行排序.我尝试通过从QTableWidget继承并定义:重新实现sortByColumn(这是在Python中):
def sortByColumn(self, col, order):
print 'got request to sort col %d in order %s' % (col, str(order) )
Run Code Online (Sandbox Code Playgroud)
然而,每当我点击我的表的一个标题时,就会继续调用正常的排序方法.
我怎样才能覆盖它?
以下是我添加的行类.它是由代码而不是表调用的,我希望它在添加新行时正确调用dataChanged,虽然这不起作用,但表没有做任何事情.我究竟做错了什么?
void MyModel::add(const Person& p)
{
people.push_back(p);
QModelIndex top = createIndex(people.count() - 1, 0, 0);
QModelIndex bottom = createIndex(people.count() - 1, 3, 0);
emit dataChanged(top, bottom); // emit layoutChanged() if headers changed
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在QTableView中实现类似Excel的行为,其中边框绘制在整个当前选择周围.我尝试了这种感觉就像一百种不同的方式,并不断遇到问题.我可以很容易地绘制边框,但只要选择更改,就会留下边框的残余.这是我在QTableView :: paintEvent中尝试过的一个例子......
void MyTableView::paintEvent(QPaintEvent* event)
{
// call QTableView's paint event first so we can draw over it
QTableView::paintEvent(event);
// activeSelection is a list of indexes that is updated in another function
// the function also calls QTableView::repaint whenever this list changes
// in an attempt to erase the previously drawn border
if(!activeSelection.size())
return;
QRect rect = visualRect(activeSelection.at(0)) |
visualRect(activeSelection.at(activeSelection.size() - 1));
// temporarily draw smaller border so it doesn't lie on the grid lines
rect.adjust(4, 4, -4, -4); …Run Code Online (Sandbox Code Playgroud) 在Mint Linux 12上使用Qt4.8,我实现了一个包含QTableView显示模型内容的简单窗口.模型数据不断更新(记录消息),并dataChanged()定期发出信号(即每100ms).
我看到的问题是桌面上的视觉更新.
我在窗口上安装了一个事件过滤器来计算updateRequest类型事件,这应该触发一个窗口小部件重绘(也可以在子窗口小部件上,即tableView).它们之间的平均时间约为170毫秒,标准偏差约为90毫秒(我猜这是相当大的).然而,感知的视觉更新率仅为每秒两到三次,我想知道为什么.似乎并非所有updateRequest事件都触发窗口小部件重绘或窗口系统吞下视觉更新.
作为第二次测试,我强制窗口通过调用repaint或update每100ms 更新自己.使用时repaint,我看到了相应的updateRequest类型事件增加和间隙标准差的减少; 用update,数量没有增加.但是,在这两种情况下,感知更新率只有适度增加.
另外:有没有一个很好的方法来衡量一个小部件实际真正重新绘制的频率,而不必重载它的paintEvent处理程序?也许来自QTest哪里?
更新:我将事件过滤器扩展为catch paintEvent-type事件.对于> 1000种updateRequest类型的事件,只有一位数的数字.
我正在使用a QTableView和a QAbstractTableModel,QSortFilterProxyModel以便我可以通过单击表格标题对项目进行排序.我想为用户添加选项,通过拖动来手动对视图中的行进行排序.我不需要能够从/向任何外部应用程序拖放,只需更改列表中的顺序即可.我也不需要更改模型中的数据,我只希望视图中的顺序不同.
我一直在寻找通过的文件,而且好像我要实现mimeTypes,mimeData和dropMimeData,但是这会非常复杂快!我的模型中的一些数据实际上并没有显示在视图中,就像我说的那样我不想改变模型中的数据顺序.有没有办法简单地拖动项目来改变他们的排序(就像标题已经能够做到)没有大量的编码?
我正在使用QTestLib框架在QTableView中为自定义Validator编写单元测试.最基本的测试用例之一可以这样描述:
双击第三列和第四行中的表格单元格,并在其内容中附加数字"5".
仅仅改变模型中的值或任何东西是不够的,测试用例应该像这样执行:
注意:这个问题有一个关于如何从代码中将表格单元格设置为编辑模式的答案,但是单元测试应该尝试坚持人类用户的可能性,即鼠标/键盘操作.
我发现可以使用QTableView :: columnViewportPosition(int)和QTableView :: rowViewportPosition(int)检索单元格的X/Y位置.但是,使用QTest :: mouseDClick(...)双击指定位置既不选择单元格也不将其设置为编辑模式:
// Retrieve X/Y coordinates of the cell in the third column and the fourth row
int xPos = m_pTableView->columnViewportPosition( 2 );
int yPos = m_pTableView->rowViewportPosition( 3 );
// This does not work
QTest::mouseDClick( m_pTableView, Qt::LeftButton, QPoint( xPos, yPos ) );
Run Code Online (Sandbox Code Playgroud)
如何使用鼠标/键盘操作实现上述测试用例?
PS:我在Windows XP 32位和Qt 4.6.1下尝试这个
我有一个QTableView4行和4列,每列代表它们的数据.默认情况下,它QTableView是可编辑的.现在我想让任何特定的列在我的文件中不可编辑QTableView.
我该怎么做?
提前致谢.
我有一个QStandardItemModel为a QTableView和一个将数据插入模型的线程提供数据.
是否可以暂时停止模型更新表视图,并在以后启用它?
我正在尝试创建一个可以像Excel一样放大和缩小的QTableView.
这里也提出了类似的问题:QWidget上的缩放功能
但是,我在PyQt中继承QTableView而不是C,因此重新实现整个PaintEvent方法有点进化.源代码有点复杂:https://qt.gitorious.org/qt/tiittane-qt/source/bdd4a9149789f60974603e1f7621d51378f0a108:src/gui/staticmviews/qtableview.cpp#L1282
我正在寻找是否有任何其他可行的选项来拥有可缩放的TableView.我的第一次尝试是通过设置字体大小然后实现每个列和行宽度也必须缩放,这可能会变慢.然后意识到改变字体会改变打印.它似乎不是一个优雅的解决方案.在绘画之前改变画家的规模似乎是更优雅的解决方案,但是必须重新实现并将相当多的代码翻译成python才能这样做.我想知道是否有任何其他钩子来完成这件事.
谢谢