QTableWidget执行setCellWidget后,引入的排序问题?

中才德创 2011-12-13 02:51:47
如果表格项是下面的这种普通的子项填入方式,那么,其排序是没有问题的。

如果,每个子项成了QLabel,且以setCellWidget方式填入。那么,排序出现失效问题

这当如何解决呢?

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, m_pTable1(NULL)
{
m_pTable1 = new QTableWidget(this);
m_pTable1->setGeometry(10, 50, 800, 200);
m_pTable1->setRowCount(3);
m_pTable1->setColumnCount(3);

QTableWidgetItem *pTableWidgetHeader0 = new QTableWidgetItem("name");
QTableWidgetItem *pTableWidgetItem00 = new QTableWidgetItem("chenxueli");
QTableWidgetItem *pTableWidgetItem10 = new QTableWidgetItem("chenqiuyue");
QTableWidgetItem *pTableWidgetItem20 = new QTableWidgetItem("cundaofan");
m_pTable1->setHorizontalHeaderItem(0, pTableWidgetHeader0);
m_pTable1->setItem(0, 0, pTableWidgetItem00);
m_pTable1->setItem(1, 0, pTableWidgetItem10);
m_pTable1->setItem(2, 0, pTableWidgetItem20);

QTableWidgetItem *pTableWidgetHeader1 = new QTableWidgetItem("content");
QTableWidgetItem *pTableWidgetItem01 = new QTableWidgetItem("Hello!");
QTableWidgetItem *pTableWidgetItem11 = new QTableWidgetItem("How are you?");
QTableWidgetItem *pTableWidgetItem21 = new QTableWidgetItem("Welcome");
m_pTable1->setHorizontalHeaderItem(1, pTableWidgetHeader1);
m_pTable1->setItem(0, 1, pTableWidgetItem01);
m_pTable1->setItem(1, 1, pTableWidgetItem11);
m_pTable1->setItem(2, 1, pTableWidgetItem21);

QTableWidgetItem *pTableWidgetHeader2 = new QTableWidgetItem("status");
QTableWidgetItem *pTableWidgetItem02 = new QTableWidgetItem("success");
QTableWidgetItem *pTableWidgetItem12 = new QTableWidgetItem("success");
QTableWidgetItem *pTableWidgetItem22 = new QTableWidgetItem("fail");
m_pTable1->setHorizontalHeaderItem(2, pTableWidgetHeader2);
m_pTable1->setItem(0, 2, pTableWidgetItem02);
m_pTable1->setItem(1, 2, pTableWidgetItem12);
m_pTable1->setItem(2, 2, pTableWidgetItem22);

m_pTable1->horizontalHeaderItem(0)->setTextAlignment(Qt::AlignLeft);
m_pTable1->horizontalHeaderItem(1)->setTextAlignment(Qt::AlignHCenter);
m_pTable1->horizontalHeaderItem(2)->setTextAlignment(Qt::AlignRight);

m_pTable1->setSortingEnabled(true);
m_pTable1->setWordWrap(true);

resize(900, 300);
}
...全文
516 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
中才德创 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 warknife 的回复:]
我猜楼主是为了实现改变cell的背景之类的效果吧。
可以找个变通的方法,添加两列,一列是QLabel,一列是QLabel的值。其中QLabel值的列隐藏。排序触发QLabel值的列排序。
[/Quote]思路有点类近。不过是,QLabel与QTabelWidgetItem同时存在于表格的同一位置上,它们会同时显示。前者用来显示,后者用来排序。(理论上说,它们的字符串可以大不一样)
可是这样的话,同时显示,很容易产生重影。所以,还需进一步加工下,在皮肤qss中,QTabelWidgetItem所表示的字符串必须透明。
以下方法可以做到:
QTableWidget {
color:transparent;
selection-color: transparent;
}
warknife 2011-12-14
  • 打赏
  • 举报
回复
我猜楼主是为了实现改变cell的背景之类的效果吧。
可以找个变通的方法,添加两列,一列是QLabel,一列是QLabel的值。其中QLabel值的列隐藏。排序触发QLabel值的列排序。
zhh_kv 2011-12-13
  • 打赏
  • 举报
回复
如果,每个子项成了QLabel,且以setCellWidget方式填入。那么,排序出现失效问题。
~~~~··
可以自己维护某列的QWidget链表,需要排序时,qSort排序,然后在TableWiget中更改widget的位置。
warknife 2011-12-13
  • 打赏
  • 举报
回复
仅仅是一个推理,没时间验证根据。

通常排序都涉及到链表。正常加入数据,链表指向的是列的数据体。如果用QLabel加入,有可能链表指向的是QLabel指针,所以引发排序问题。

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧