Qt,如果单元格是小部件,我如何对 QTableWidget 列进行排序

Qt, How can I sort QTableWidget column if the cells are widgets

我有一个QTableWidget,有些栏是文字,有些是数字,这些栏可以很好地排序。但是我还有一个包含自定义小部件的列,我应该如何为这些启用排序?

我的第一个想法当然是在QTableWidgetItem上重载'<'方法,但是没有QTableWidgetItem。那么解决这个问题的最佳方法是什么?

QTableWidget 不适合这种情况,请考虑使用 QTableView。无论如何,我将向您展示如何在 QTableWidget.

中对 QProgressBar 小部件进行排序

正如您已经说过的,对于这种情况,您可以重载 <() operator。假设您在第 4 列中有一个 QProgressBar。您必须重载 <() 运算符。

您必须继承 QProgressBarQTableWidgetItem

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 方法)。

这是 QTableWidgetQProgressBar 排序的屏幕截图。