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

时间:2018-03-20 17:01:01

标签: qt qtablewidget qtablewidgetitem

我有一个QTableWidget,有些列填充了文本,有些列带有数字,这些列可以排序。但我也有一个包含自定义小部件的列,我该如何为这些小部件启用排序?

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

1 个答案:

答案 0 :(得分:1)

QTableWidget对于这种情况并不理想,请考虑使用QTableView。无论如何,我将向您展示如何在QProgressBar中对QTableWidget窗口小部件进行排序。

正如您已经说过的,对于这种情况,您可以重载<() 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语句,正如你在上面看到的那样排序数字和进度条。

ui->tableWidget->setItem(ui->tableWidget->rowCount()-1, 0, new CustomTableWidgetItem(QString::number(ui->tableWidget->rowCount())));

您也可以将此方法与其他小部件一起使用,只需将正确的小部件子类化,但通常最好使用QTableView(MVC方法)。

以下是QTableWidgetQProgressBar排序的屏幕截图。

enter image description here