我有一个QTableWidget
,有些列填充了文本,有些列带有数字,这些列可以排序。但我也有一个包含自定义小部件的列,我该如何为这些小部件启用排序?
我的第一个想法当然是重载'<'
上的QTableWidgetItem
方法,但没有QTableWidgetItem
。那么解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
QTableWidget
对于这种情况并不理想,请考虑使用QTableView
。无论如何,我将向您展示如何在QProgressBar
中对QTableWidget
窗口小部件进行排序。
正如您已经说过的,对于这种情况,您可以重载<() operator
。假设您在第4列中有一个QProgressBar
。您必须重载<()
运算符。
您必须继承QProgressBar
和QTableWidgetItem
。
class CustomTableWidgetItem : public QProgressBar, public QTableWidgetItem
{
Q_OBJECT
public:
CustomTableWidgetItem( QWidget* parent ) : QProgressBar( parent )
{
}
CustomTableWidgetItem(const QString txt = QString("0"))
:QTableWidgetItem(txt)
{
}
bool operator <(const QTableWidgetItem& other) const
{
if(other.column() == 0 /* numeric cell */) {
return QTableWidgetItem::text().toInt() < other.text().toInt();
}
else if(other.column() == 4 /* progress bar */) {
const QProgressBar *p = dynamic_cast<const QProgressBar *>(&other);
if(p != 0) {
if(this->value() < p->value())
return true;
}
}
return false;
}
};
然后你可以在4号单元格中插入你的QProgressBar。
像这样插入QProgressBar
ui->tableWidget->insertRow(ui->tableWidget->rowCount());
CustomTableWidgetItem *pgbar = new CustomTableWidgetItem(this);
ui->tableWidget->setCellWidget(ui->tableWidget->rowCount()-1, 4, pgbar);
ui->tableWidget->setItem(ui->tableWidget->rowCount()-1, 4, pgbar);
假设您希望在单元格1中使用QTableWidgetItem
。
ui->tableWidget->setItem(ui->tableWidget->rowCount()-1, 1, new QTableWidgetItem("Hello"));
如果你想对数字进行排序,例如在单元格0中使用CustomTableWidgetItem,因为我们已经实现了一个if语句,正如你在上面看到的那样排序数字和进度条。
ui->tableWidget->setItem(ui->tableWidget->rowCount()-1, 0, new CustomTableWidgetItem(QString::number(ui->tableWidget->rowCount())));
您也可以将此方法与其他小部件一起使用,只需将正确的小部件子类化,但通常最好使用QTableView(MVC方法)。
以下是QTableWidget
和QProgressBar
排序的屏幕截图。