Qt,如果单元格是小部件,我如何对 QTableWidget 列进行排序
Qt, How can I sort QTableWidget column if the cells are widgets
我有一个QTableWidget
,有些栏是文字,有些是数字,这些栏可以很好地排序。但是我还有一个包含自定义小部件的列,我应该如何为这些启用排序?
我的第一个想法当然是在QTableWidgetItem
上重载'<'
方法,但是没有QTableWidgetItem
。那么解决这个问题的最佳方法是什么?
QTableWidget
不适合这种情况,请考虑使用 QTableView
。无论如何,我将向您展示如何在 QTableWidget
.
中对 QProgressBar
小部件进行排序
正如您已经说过的,对于这种情况,您可以重载 <() 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-statement,如您在上面看到的用于对数字和进度条进行排序。
ui->tableWidget->setItem(ui->tableWidget->rowCount()-1, 0, new CustomTableWidgetItem(QString::number(ui->tableWidget->rowCount())));
您也可以将此方法与其他小部件一起使用,只需将正确的小部件子类化即可,但通常最好使用 QTableView(MVC 方法)。
这是 QTableWidget
和 QProgressBar
排序的屏幕截图。
我有一个QTableWidget
,有些栏是文字,有些是数字,这些栏可以很好地排序。但是我还有一个包含自定义小部件的列,我应该如何为这些启用排序?
我的第一个想法当然是在QTableWidgetItem
上重载'<'
方法,但是没有QTableWidgetItem
。那么解决这个问题的最佳方法是什么?
QTableWidget
不适合这种情况,请考虑使用 QTableView
。无论如何,我将向您展示如何在 QTableWidget
.
QProgressBar
小部件进行排序
正如您已经说过的,对于这种情况,您可以重载 <() 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-statement,如您在上面看到的用于对数字和进度条进行排序。
ui->tableWidget->setItem(ui->tableWidget->rowCount()-1, 0, new CustomTableWidgetItem(QString::number(ui->tableWidget->rowCount())));
您也可以将此方法与其他小部件一起使用,只需将正确的小部件子类化即可,但通常最好使用 QTableView(MVC 方法)。
这是 QTableWidget
和 QProgressBar
排序的屏幕截图。