#创作灵感#
在Qt一个滚动区域(ui->scrollArea)中,添加了一个垂直布局控件(m_layout),垂直布局控件中被动态添加了多个自定义控件(CustomItem,继承QWidget)。
现需要依据指定条件(如:CustomItem的name)搜索布局控件中的CustomItem,并将搜索到的CustomItem显示在滚动区域视口的最顶端。
实例代码如下:
void MainWindow::on_btnSearch_clicked()
{
// 获取搜索文本并移除字符串两端的空白字符(空格、制表符、换行符等)
QString text = ui->lEditSearch->text();
text = text.trimmed();
if(m_layout== nullptr) {
return;
}
int count = m_layout->count();
bool findIt = false;
for(int i = 0; i < count; i++) {
QLayoutItem *item = m_layout->itemAt(i);
CustomItem* customItem = dynamic_cast<CustomItem*>(item->widget());
if(customItem == nullptr) {
continue;
}
// 查找控件名称中是否包含搜索字段
if(customItem->getName().contains(text)) {
// 确保目标控件是布局中的一个有效小部件
int index = m_layout->indexOf(customItem);
if(index == -1) {
continue;
}
// 计算目标控件相对于 viewport 的位置
QWidget *viewport = ui->scrollArea->viewport();
QPoint pos = customItem->mapTo(viewport, QPoint(0, 0));
// 获取 viewport(视口) 的大小并计算目标控件与视口顶部的偏置高度
QRect viewportRect = viewport->rect();
int offset = pos.y() - viewportRect.y();
// 当前滚动条偏置位置
int verticalOffset = ui->scrollArea->verticalScrollBar()->value();
// 计算新的滚动条位置,使目标控件出现在顶部
int newOffset = verticalOffset + offset;
ui->scrollArea->verticalScrollBar()->setValue(newOffset);
// 设置搜索到的控件序号
int number = customItem->getNumber();
ui->lbSearchRet->setText(QString("搜索到序号:%1").arg(number));
findIt = true;
break;
}
}
if(!findIt) {
ui->lbSearchRet->setText(QString("未搜索到"));
}
}