首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何控制QGridLayout中应该在GUI中绘制的小部件?

如何控制QGridLayout中应该在GUI中绘制的小部件?
EN

Stack Overflow用户
提问于 2013-03-08 13:25:28
回答 2查看 1K关注 0票数 0

在我的应用程序中,我有一个QGridLayout,它涵盖了Window的大部分。在它中,我添加了一系列QLineEdit & QLabel对象。目前,当QLineEdit对象的no > 500 && QLabel对象> 500时,GUI显着地慢&因为更大的值不能正常运行。此外,大多数这些小部件在窗口中不可见,它们需要滚动才能被查看。由于我在widgets中添加了这么多grid layout (循环&在循环后调用repaint ),画图花费了大量时间。因此,我有一个解决方案的想法,即使我的widgets被添加到Grid Layout中,也不是每个人都被绘制出来的。我希望有一个rectangle,在其中绘制所有的widgets &每当窗口滚动时,矩形的坐标就会被更新。但我不知道该怎么做。所以我想知道能不能这么做?如果可能的话,请添加一个小的示例代码,以便我能够理解如何实现它。谢谢。

UPDATE:添加一个图像来描述情景。

代码语言:javascript
运行
复制
Black Rectangle = QGridLayout say myGid.

Red Rectangle = Bounding Rectangle which is approximately same size as Main Window of my Application.

Green Rectangle = Widgets in myGrid.

Green Rectangle filled with yellow = Widgets shown in Main Window (只有这些小部件应该被考虑用于调用repaint__),其余未填充的矩形是在myGrid中存在的小部件,但不考虑调用repaint。因此,当我在我的主要应用程序中滚动时,red rectangle的协调被更新&所有我希望我使问题简单易懂的widgets bounded by it are considered for repaint.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-12 14:57:52

我知道你不想放弃你的代码。我会尝试其中之一,从最简单的:

  • 您是使用QScrollArea还是使用滚动条来模拟它?QScrollArea可能已经将画图事件丢弃给在视口之外的子部件。在屏幕外组装网格。否则,Qt将在每次添加新小部件时重新计算和重新绘制布局。(下面是一个完整的例子.) QWidget*小部件=新的QWidget();//这是一个不可见的小部件。for (int i= 0;i< 100;i++) { for (int j= 0;j< 100;j++) { QLineEdit* lineEdit =新的QLineEdit();lineEdit>setText(QString(“I是在(%1,%2)处编辑的行”).arg(I).arg( j);布局->addWidget(lineEdit,i,j);如果(j % 10 == 0) { //在UI正在组装时不阻塞UI线程。qApp->processEvents();}}/布局只计算一次,这里:scrollArea->setWidget(小部件);小部件->show();
  • 如果这不起作用,创建一个具有可见矩形引用的事件过滤器。事件过滤是一种有用的技术,您可以拦截针对一个或多个小部件的事件,并在处理之前决定是否应该丢弃它们。 在您的情况下,当您拦截一个QPaintEvent时,检查目标小部件是否与可见的矩形相交。如果是这样的话,将事件传递给目标小部件。如果没有,就放弃这个事件。 我不知道你如何滚动你的UI的细节,所以我把计算可见的矩形留给你。事件过滤器代码应该是这样的。 bool MyClass::eventFilter(QObject *obj,QEvent *event) { if (事件->type() == QEvent::QEvent){ if (QWidget* widget = qobject_cast(object)) { QRect visibleRectangle = somehowGetVisibleRectangle();if {QRect visibleRectangle=somehowGetVisibleRectangle();}=={ //返回true意味着“删除此事件”。返回true;}} //假设MyClass扩展QWidget。根据需要调整。返回QWidget::eventFilter(obj,event);}
  • 最后,使用QGraphicsSceneQGraphicsWidgetQGraphicsGridLayoutQGraphicsView中继您的UI。场景图可能更好地放弃不必要的UI重绘。
票数 3
EN

Stack Overflow用户

发布于 2013-03-08 13:55:06

首先。你确定你在用正确的方式解决你的问题吗?也许你和QTableWidget在一起会更快乐?它的单元格可以编辑,然后QTableWidget将负责为正在编辑的单元格创建和维护QLineEdit。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15295009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档