在我的应用程序中,我有一个QGridLayout
,它涵盖了Window
的大部分。在它中,我添加了一系列QLineEdit
& QLabel
对象。目前,当QLineEdit
对象的no > 500 && QLabel
对象> 500时,GUI
显着地慢&因为更大的值不能正常运行。此外,大多数这些小部件在窗口中不可见,它们需要滚动才能被查看。由于我在widgets
中添加了这么多grid layout
(循环&在循环后调用repaint
),画图花费了大量时间。因此,我有一个解决方案的想法,即使我的widgets
被添加到Grid Layout
中,也不是每个人都被绘制出来的。我希望有一个rectangle
,在其中绘制所有的widgets
&每当窗口滚动时,矩形的坐标就会被更新。但我不知道该怎么做。所以我想知道能不能这么做?如果可能的话,请添加一个小的示例代码,以便我能够理解如何实现它。谢谢。
UPDATE:添加一个图像来描述情景。
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.
。
发布于 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);}QGraphicsScene
、QGraphicsWidget
、QGraphicsGridLayout
和QGraphicsView
中继您的UI。场景图可能更好地放弃不必要的UI重绘。发布于 2013-03-08 13:55:06
首先。你确定你在用正确的方式解决你的问题吗?也许你和QTableWidget在一起会更快乐?它的单元格可以编辑,然后QTableWidget将负责为正在编辑的单元格创建和维护QLineEdit。
https://stackoverflow.com/questions/15295009
复制相似问题