QT学习,求解释

weixin_38910147 2018-03-15 01:23:07

QTableWidgetSelectionRange Spreadsheet::selectedRange() const
{
QList<QTableWidgetSelectionRange> ranges = selectedRanges();
if (ranges.isEmpty())
return QTableWidgetSelectionRange();
return ranges.first();
}

书上说因为在构造函数中已经设置了选择模式为QAbstractItemView::ContiguousSelection,所以选择范围不可以能再超过1。
这句话我没看懂,特别是不能再超过1这里,我没看懂。
这句话我没看懂,特别是不能再超过1这里,我没看懂。
这句话我没看懂,特别是不能再超过1这里,我没看懂。
重要的事情说三遍!求解释。

void Spreadsheet::copy()
{
QTableWidgetSelectionRange range = selectedRange();
QString str;

for (int i = 0; i < range.rowCount(); ++i) {
if (i > 0)
str += "\n";
for (int j = 0; j < range.columnCount(); ++j) {
if (j > 0)
str += "\t";
str += formula(range.topRow() + i, range.leftColumn() + j);
}
}
QApplication::clipboard()->setText(str);
}



void Spreadsheet::paste()
{
QTableWidgetSelectionRange range = selectedRange();
QString str = QApplication::clipboard()->text();
QStringList rows = str.split('\n');
int numRows = rows.count();
int numColumns = rows.first().count('\t') + 1;

if (range.rowCount() * range.columnCount() != 1
&& (range.rowCount() != numRows
|| range.columnCount() != numColumns)) {
QMessageBox::information(this, tr("Spreadsheet"),
tr("The information cannot be pasted because the copy "
"and paste areas aren't the same size."));
return;
}

for (int i = 0; i < numRows; ++i) {
QStringList columns = rows[i].split('\t');
for (int j = 0; j < numColumns; ++j) {
int row = range.topRow() + i;
int column = range.leftColumn() + j;
if (row < RowCount && column < ColumnCount)
setFormula(row, column, columns[j]);
}
}
somethingChanged();
}


我个人觉得可能是因为我上面的选择模式没搞懂,所以在past槽中其中一句: if (range.rowCount() * range.columnCount() != 1&&(...)),我没有看懂。
求解释,求帮忙!
求解释,求帮忙!
求解释,求帮忙!
求解释,求帮忙!
...全文
620 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38910147 2018-03-16
  • 打赏
  • 举报
回复
引用 3 楼 jxbinwd 的回复:
[quote=引用 2 楼 weixin_38910147 的回复:] [quote=引用 1 楼 jxbinwd 的回复:] 不要在意哪句话(我都没看懂,也许书上写错了), 你只要理解QAbstractItemView::ContiguousSelection模式的含义就行了。 ContiguousSelection模式,通常情况下只选中一项,选择另一项时当前选中项则不再选中。但是也可以多选,按Shift键再去选就可以多选(这跟PC选中文件或文件夹方式一样的)。 if (range.rowCount() * range.columnCount() != 1 && (range.rowCount() != numRows || range.columnCount() != numColumns)) range.rowCount() * range.columnCount() != 1:表示你选择了多项, range.rowCount() != numRows || range.columnCount() != numColumns:表示你选择多项的行数或列数,跟剪切板中的内容换算出来的行数或列数判断不相同 (可能剪切板中数据破坏,或者你说复制了其它内容等等) 满足上面条件的,是给出提示(QMessageBox::information)
嗯,但是我还有一个疑问,在这个函数中:

QTableWidgetSelectionRange Spreadsheet::selectedRange() const
{
    QList<QTableWidgetSelectionRange> ranges = selectedRanges();
    if (ranges.isEmpty())
        return QTableWidgetSelectionRange();
    return ranges.first();
}
QList<QTableWidgetSelectionRange> ranges = selectedRanges() ; 为啥这个函数只返回第一个节点( return ranges.first();)?? 求解释![/quote] QList<QTableWidgetSelectionRange>表示QList的元素是选定的区域, return ranges.first():表示返回第一个选定区域。 这里就可以理解”选择模式为QAbstractItemView::ContiguousSelection,所以选择范围不可能再超过1“这句话了。 因为QAbstractItemView::ContiguousSelection模式只能选定一个区域,所以return ranges.first()就够了 “选择范围不可能再超过1”改为“选择区域的个数不可能再超过1”就好理解多了 [/quote] 谢谢了,我已经懂了QAbstractItemView::ContiguousSelection在这个模式下选定的区域都可以变相的看作是一个整体,所以QList<QTableWidgetSelectionRange> ranges链表中只保存了一个对象。
萧洛 2018-03-16
  • 打赏
  • 举报
回复
引用 2 楼 weixin_38910147 的回复:
[quote=引用 1 楼 jxbinwd 的回复:] 不要在意哪句话(我都没看懂,也许书上写错了), 你只要理解QAbstractItemView::ContiguousSelection模式的含义就行了。 ContiguousSelection模式,通常情况下只选中一项,选择另一项时当前选中项则不再选中。但是也可以多选,按Shift键再去选就可以多选(这跟PC选中文件或文件夹方式一样的)。 if (range.rowCount() * range.columnCount() != 1 && (range.rowCount() != numRows || range.columnCount() != numColumns)) range.rowCount() * range.columnCount() != 1:表示你选择了多项, range.rowCount() != numRows || range.columnCount() != numColumns:表示你选择多项的行数或列数,跟剪切板中的内容换算出来的行数或列数判断不相同 (可能剪切板中数据破坏,或者你说复制了其它内容等等) 满足上面条件的,是给出提示(QMessageBox::information)
嗯,但是我还有一个疑问,在这个函数中:

QTableWidgetSelectionRange Spreadsheet::selectedRange() const
{
    QList<QTableWidgetSelectionRange> ranges = selectedRanges();
    if (ranges.isEmpty())
        return QTableWidgetSelectionRange();
    return ranges.first();
}
QList<QTableWidgetSelectionRange> ranges = selectedRanges() ; 为啥这个函数只返回第一个节点( return ranges.first();)?? 求解释![/quote] QList<QTableWidgetSelectionRange>表示QList的元素是选定的区域, return ranges.first():表示返回第一个选定区域。 这里就可以理解”选择模式为QAbstractItemView::ContiguousSelection,所以选择范围不可能再超过1“这句话了。 因为QAbstractItemView::ContiguousSelection模式只能选定一个区域,所以return ranges.first()就够了 “选择范围不可能再超过1”改为“选择区域的个数不可能再超过1”就好理解多了
weixin_38910147 2018-03-15
  • 打赏
  • 举报
回复
引用 1 楼 jxbinwd 的回复:
不要在意哪句话(我都没看懂,也许书上写错了), 你只要理解QAbstractItemView::ContiguousSelection模式的含义就行了。 ContiguousSelection模式,通常情况下只选中一项,选择另一项时当前选中项则不再选中。但是也可以多选,按Shift键再去选就可以多选(这跟PC选中文件或文件夹方式一样的)。 if (range.rowCount() * range.columnCount() != 1 && (range.rowCount() != numRows || range.columnCount() != numColumns)) range.rowCount() * range.columnCount() != 1:表示你选择了多项, range.rowCount() != numRows || range.columnCount() != numColumns:表示你选择多项的行数或列数,跟剪切板中的内容换算出来的行数或列数判断不相同 (可能剪切板中数据破坏,或者你说复制了其它内容等等) 满足上面条件的,是给出提示(QMessageBox::information)
嗯,但是我还有一个疑问,在这个函数中:

QTableWidgetSelectionRange Spreadsheet::selectedRange() const
{
    QList<QTableWidgetSelectionRange> ranges = selectedRanges();
    if (ranges.isEmpty())
        return QTableWidgetSelectionRange();
    return ranges.first();
}
QList<QTableWidgetSelectionRange> ranges = selectedRanges() ; 为啥这个函数只返回第一个节点( return ranges.first();)?? 求解释!
萧洛 2018-03-15
  • 打赏
  • 举报
回复
不要在意哪句话(我都没看懂,也许书上写错了), 你只要理解QAbstractItemView::ContiguousSelection模式的含义就行了。 ContiguousSelection模式,通常情况下只选中一项,选择另一项时当前选中项则不再选中。但是也可以多选,按Shift键再去选就可以多选(这跟PC选中文件或文件夹方式一样的)。 if (range.rowCount() * range.columnCount() != 1 && (range.rowCount() != numRows || range.columnCount() != numColumns)) range.rowCount() * range.columnCount() != 1:表示你选择了多项, range.rowCount() != numRows || range.columnCount() != numColumns:表示你选择多项的行数或列数,跟剪切板中的内容换算出来的行数或列数判断不相同 (可能剪切板中数据破坏,或者你说复制了其它内容等等) 满足上面条件的,是给出提示(QMessageBox::information)

16,213

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧