Qt的,我怎么能排序QTableWidget的列,如果细胞是小部件(Qt, How can I so

2019-10-28 13:31发布

我有一个QTableWidget ,一些中填入的文字,有的用数字,这些列的罚款排序。 但我也有自定义部件列,我应该如何帮助整理这些?

我首先想到的是当然超负荷的'<'上的方法QTableWidgetItem ,但目前还没有QTableWidgetItem 。 因此,这将是解决这个的最好方法?

Answer 1:

QTableWidget是不理想的这种情况下,可以考虑使用QTableView 。 无论如何,我会告诉你如何排序QProgressBar在小部件QTableWidget

正如你已经说了,你可以重载<() operator这种情况。 比方说,你有一个QProgressBar在列数4.你必须重载<()操作。

你必须继承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;
    }
};

然后你可以将你的QProgressBar这样的细胞数量4。

插入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排序。



文章来源: Qt, How can I sort QTableWidget column if the cells are widgets