Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何同步已隐藏的模型视图?_Qt_Scrollto_Qlistview - Fatal编程技术网

Qt 如何同步已隐藏的模型视图?

Qt 如何同步已隐藏的模型视图?,qt,scrollto,qlistview,Qt,Scrollto,Qlistview,同一个模型有三个视图:两个QListView和一个QTableView。通常只有一个视图可见,但用户可以切换视图,隐藏当前视图并使其他视图之一可见。Qt不更新隐藏视图,因此我需要滚动已设置为可见的视图,以匹配以前的视图。问题是,当QListView设置为可见时,绘制和设置滚动条等需要时间。如何可靠地确定视图何时准备好接受scrollTo请求 我曾尝试计算滚动条的最大值,然后检查horizontalScrollBar()->maximum(),但在小部件滚动条达到最大大小后仍有延迟。我还监视了所有

同一个模型有三个视图:两个QListView和一个QTableView。通常只有一个视图可见,但用户可以切换视图,隐藏当前视图并使其他视图之一可见。Qt不更新隐藏视图,因此我需要滚动已设置为可见的视图,以匹配以前的视图。问题是,当QListView设置为可见时,绘制和设置滚动条等需要时间。如何可靠地确定视图何时准备好接受scrollTo请求

我曾尝试计算滚动条的最大值,然后检查horizontalScrollBar()->maximum(),但在小部件滚动条达到最大大小后仍有延迟。我还监视了所有视图小部件事件,包括多个绘制事件,直到小部件完成。我更愿意在计时器上轮询QListView以确定它何时准备就绪,但我不知道调用什么

void MW::gridDisplay()
{
    // hide thumbView (QListView)
    thumbView->setVisible(false);  

    // show gridView (QListView)
    gridView->setVisible(true); 
    gridView->setFocus();      

    // scrollTo not working if gridView was hidden unless delay by about 300ms
    // until gridView is ready
    gridView->scrollTo(gridView->currentIndex(), gridView->ScrollHint::PositionAtCenter);
}

我真的试图重现你的错误,但我就是看不到你的行为。该应用程序有两个视图,可以通过拖放或在末尾添加项目来隐藏和修改

尽管如此,更新工作还是如预期的那样。也许你的应用程序还是有些不同。(我正在使用Qt5.13.0)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
自动f=新QFrame;
auto viewLeft=新的QTreeView;
auto viewRight=新的QTreeView;
自动模型=新的QS标准模型;
viewLeft->setDragDropMode(QAbstractItemView::DragDropMode::InternalMove);
viewRight->setDragDropMode(QAbstractItemView::DragDropMode::InternalMove);
viewLeft->setModel(模型);
viewRight->setModel(模型);
自动项目1=新的QS标准项目(“项目1”);
模型->附录行(第1项);
自动项目2=新的QS标准项目(“项目2”);
模型->附录行(第2项);
自动项目3=新的QS标准项目(“项目3”);
第2项->附录行(第3项);
f->setLayout(新的QHBoxLayout);
f->layout()->addWidget(viewLeft);
f->layout()->addWidget(右视图);
自动grpBox=新的QGroupBox;
grpBox->setLayout(新的QHBoxLayout);
auto chkLeft=新的QCheckBox(“左”);
auto chkRight=新的QCheckBox(“右”);
grpBox->layout()->addWidget(chkLeft);
grpBox->layout()->addWidget(chkRight);
f->layout()->addWidget(grpBox);
自动btnAdd=新的QPUSH按钮(“添加”);
QObject::connect(b添加,&QPushButton::单击,[&](){
型号->附录行(新QS标准项(“新项目”);
});
f->layout()->addWidget(btnAdd);
连接(chkLeft,&QCheckBox::切换,[&](自动选中){viewleet->setVisible(选中);});
连接(chkRight,&QCheckBox::切换,[&](自动选中){viewRight->setVisible(选中);});
f->show();
返回a.exec();
}

我找出了导致QListView呈现延迟的原因,在调用QListView::scrollTo()之前需要延迟。我包含了一个QListView::setLayoutMode(QListView::Batched),它确实会减慢速度。下面是一些说明问题的代码:

#include <QtWidgets>
#include <QDebug>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    auto f = new QFrame;
    auto blank = new QListView;
    auto view = new QListView;
    view->setViewMode(QListView::IconMode);
    view->setResizeMode(QListView::Adjust);

    // this prevents the scrollTo working in time
    view->setLayoutMode(QListView::Batched);

    auto stack = new QStackedLayout;
    f->setLayout(stack);
    f->layout()->addWidget(blank);
    f->layout()->addWidget(view);

    QFile file("D:/Pictures/Avatars/frog.jpg");  // substitute your own image
    QImage image;
    QImageReader thumbReader;
    thumbReader.setFileName("D:/Pictures/Avatars/frog.jpg");
    thumbReader.setScaledSize(QSize(40,40));
    image = thumbReader.read();

    auto model = new QStandardItemModel;
    view->setModel(model);
    for (int row = 0; row < 50000; ++row) {
        auto item = new QStandardItem();
        item->setData(QString::number(row), Qt::DisplayRole);
        item->setIcon(QPixmap::fromImage(image));
        model->appendRow(item);
    }
    stack->setCurrentIndex(1);

    // scrollTo does not work if view->setLayoutMode(QListView::Batched) without a delay
    view->scrollTo(model->index(40000,0), QAbstractItemView::PositionAtCenter);
    f->show();
    return a.exec();
}

#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
自动f=新QFrame;
自动空白=新的QListView;
自动查看=新的QListView;
视图->设置视图模式(QListView::IconMode);
view->setResizeMode(QListView::Adjust);
//这会阻止滚动条及时工作
查看->设置布局模式(QListView::批处理);
自动堆叠=新的QStackedLayout;
f->setLayout(堆栈);
f->layout()->addWidget(空白);
f->layout()->addWidget(视图);
QFile文件(“D:/Pictures/Avatars/frog.jpg”);//替换您自己的图像
图像;
QImageReader拇指阅读器;
setFileName(“D:/Pictures/Avatars/frog.jpg”);
thumbReader.setScaledSize(QSize(40,40));
image=thumbleader.read();
自动模型=新的QS标准模型;
查看->设置模型(模型);
对于(int行=0;行<50000;++行){
自动项=新的QStandardItem();
item->setData(QString::number(行),Qt::DisplayRole);
项目->设置图标(QPixmap::fromImage(图像));
模型->追加行(项目);
}
堆栈->设置当前索引(1);
//如果视图->setLayoutMode(QListView::Batched)没有延迟,则scrollTo不起作用
视图->滚动到(模型->索引(40000,0),qabstractemview::PositionAtCenter);
f->show();
返回a.exec();
}

非常感谢您的帮助和建议,以创建一个最小的可复制示例。吸取的教训。

@eyllanesc DoneMaybe这将有所帮助:而且,这不是一个。。。我甚至不能用那个代码重现这个问题。在我的问题中,您可以看到Qt MCVE的一个示例。如果您没有用该代码得到答案,我建议使用尽可能短的
main
函数,该函数使用数据创建视图和QStandardItemModel,然后可能使用按钮或QTimer来触发问题,并将它们的点击/超时信号连接到lambdas,以使其全部工作,因此问题被再现。还有一个建议:如果这些视图在应用程序窗口中占据相同的空间,那么不要显示和隐藏自己,请考虑使用:@ HyDe好主意,但默认启用UpDeTestStand是真的。此外,视图不在同一应用程序窗口中。感谢您的反馈。我将研究一个最小的可复制示例。我的观点有成千上万的图标。如果你没有足够多的项目,那么就没有问题,因为小部件可以足够快地构建。不幸的是,我有一些事情发生了,我将离开几个星期。稍后我将添加一个可复制的示例。再次感谢您抽出时间。
#include <QtWidgets>
#include <QDebug>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    auto f = new QFrame;
    auto blank = new QListView;
    auto view = new QListView;
    view->setViewMode(QListView::IconMode);
    view->setResizeMode(QListView::Adjust);

    // this prevents the scrollTo working in time
    view->setLayoutMode(QListView::Batched);

    auto stack = new QStackedLayout;
    f->setLayout(stack);
    f->layout()->addWidget(blank);
    f->layout()->addWidget(view);

    QFile file("D:/Pictures/Avatars/frog.jpg");  // substitute your own image
    QImage image;
    QImageReader thumbReader;
    thumbReader.setFileName("D:/Pictures/Avatars/frog.jpg");
    thumbReader.setScaledSize(QSize(40,40));
    image = thumbReader.read();

    auto model = new QStandardItemModel;
    view->setModel(model);
    for (int row = 0; row < 50000; ++row) {
        auto item = new QStandardItem();
        item->setData(QString::number(row), Qt::DisplayRole);
        item->setIcon(QPixmap::fromImage(image));
        model->appendRow(item);
    }
    stack->setCurrentIndex(1);

    // scrollTo does not work if view->setLayoutMode(QListView::Batched) without a delay
    view->scrollTo(model->index(40000,0), QAbstractItemView::PositionAtCenter);
    f->show();
    return a.exec();
}