QT中如何得到表格中选定的行号,且行号从大到小排列
时间: 2023-11-28 08:50:11 浏览: 69
在QT中,可以通过QTableWidget的selectedRows()函数获取选定的行号,并且可以使用std::sort()函数对行号进行排序,使其从大到小排列。以下是示例代码:
```cpp
// 获取选定的行号
QList<int> selectedRows;
foreach (QModelIndex index, ui->tableWidget->selectionModel()->selectedRows())
{
selectedRows << index.row();
}
// 对选定的行号进行排序
std::sort(selectedRows.begin(), selectedRows.end(), std::greater<int>());
// 输出排序后的行号
foreach (int row, selectedRows)
{
qDebug() << "Selected row: " << row;
}
```
需要注意的是,这里使用了std::greater<int>()作为排序函数,表示按照从大到小的顺序排序。如果要按照从小到大的顺序排序,则可以使用std::less<int>()作为排序函数。
相关问题
QT中设置tablewideget表格两列诗行,并且表格不带有自带的行号和列号
在Qt中,如果你想要创建一个没有默认行号和列号的TableWidget,并且希望指定特定的列合并显示成一行,你可以这样做:
首先,在`QMainWindow`或相应的窗口类中,实例化一个`QTableWidget`,并设置其属性:
```cpp
QTableWidget* table = new QTableWidget(this);
table->setShowGrid(false); // 隐藏网格线,使得行号和列号不明显
table->setHorizontalHeaderLabels(nullptr); // 不显示水平表头
table->setVerticalHeaderLabels(nullptr); // 同理,也不显示垂直表头
// 然后,如果你需要将某些列合并到一行,可以设置单元格的大小,例如,合并第一列和第二列:
int numRows = yourData.size(); // 假设yourData是一个二维数组存储数据
for (int i = 0; i < numRows; ++i) {
int colspan = 2; // 要合并的列数
for (int j = 0; j < colspan; ++j) {
QTableWidgetItem item(yourData[i][j], table->itemDelegate());
table->setItem(i, j, item);
// 设置单元格跨越两列
table->setHorizontalSpan(i, j, colspan);
}
}
```
这里假设`yourData`是一个包含你需要展示的数据的二维数组。记住,`setHorizontalSpan()`函数用于设置单元格跨越多个列。
QT 事件处理器不能获取表格的行号
在Qt中,如果你直接从事件处理器(如`QTableWidget`的事件槽函数)中尝试获取`QTableWidgetItem`或`QModelIndex`的行号,可能会遇到一些问题。这是因为事件处理器并不总是提供精确的上下文信息,特别是对于拖动事件,它们更关注的是鼠标移动的位置,而不是引发事件的实际元素。
如果你想要在拖动事件中获取当前选中单元格的行号,你应该在事件处理之前保存这个信息。例如,在`mousePressEvent()`或`currentCellChanged(const QModelIndex &/*newCurrent*/, const QModelIndex &/*oldCurrent*/)`等适当的槽函数中记录当前位置。
下面是一个简单的例子:
```cpp
class DraggedTable : public QTableWidget
{
public:
DraggedTable(QWidget* parent = nullptr)
: QTableWidget(parent) {}
private slots:
void dragMoveEvent(QDragMoveEvent* event) override {
QModelIndex currentIndex = this->currentIndex();
// ... 其他处理逻辑 ...
// 如果你想在拖动过程中获取行号
int row = currentIndex.row();
qDebug() << "Current row during drag: " << row;
}
// ... 其他槽函数 ...
protected:
void mousePressEvent(QMouseEvent *event) override {
superClassMethod(event);
m_lastClickRow = event->y(); // 这里假设你基于鼠标Y坐标确定行号
}
private:
int m_lastClickRow; // 用于存储上次点击的行号
};
```
在这里,我们通过在`mousePressEvent()`中保存点击事件的行号,然后在拖动事件中读取这个值。
阅读全文