2013-03-08 77 views
0

在我的申请中,我有一个QGridLayout,涵盖了大部分Window。其中我添加了一个序列的对象。目前当QLineEdit物件的数量> 500 & & QLabel物件> 500的GUI明显变慢&因为更大的值无法正常运作。此外,大多数这些小部件在窗口中不可见,因此需要滚动才能查看。 因为我在grid layout中添加了很多widgets(循环后通过循环&调用repaint),绘画花费了大量时间。 所以我有一个解决方案的想法,即使我的widgets被添加在Grid Layout不是每个人都画。我想要一个rectangle,其中所有的widgets被绘制& 矩形的坐标将在窗口被滚动时更新。但我不知道如何做到这一点。所以我想知道是否有可能这样做? 如果可能的话,请添加一个小示例代码,以便我能够理解如何实现该代码。 谢谢。如何控制应在GUI中绘制的QGridLayout中的Widget?

更新:添加图像来描述情景。

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. 我希望我让问题变得简单易懂。 enter image description here

+0

我知道您已经花了相当多的时间处理这个问题,但您可能需要退后一步,尝试更优雅的解决方案。 – 2013-03-12 05:12:44

+1

确实。 [如果你必须问,你可能做错了。](http://blogs.msdn.com/b/oldnewthing/archive/2007/03/01/1775759.aspx)(不完全相同的事情,但足够接近) – cgmb 2013-03-12 05:13:04

+0

@Sosukodo我有一个替代使用堆叠小工具,然后能够控制什么是绘画,但在这种情况下,我不得不添加按钮,改变小部件的索引,通过堆叠小部件显示&我不吨得到一个连续滚动,因为我没有堆叠的小部件会得到。 – 2013-03-12 05:19:27

回答

3

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

  • 您在使用使用滚动条的QScrollArea或者你模仿呢? QScrollArea可能已经将绘画事件丢弃到视口外的子部件。在屏幕外组装网格。否则,Qt会在每次添加新窗口小部件时重新计算和重新绘制布局。 (Here is a complete example

    QWidget* widget = new QWidget(); // This is an invisible widget. 
    
    for (int i = 0; i < 100; i++) { 
        for (int j = 0; j < 100; j++) { 
         QLineEdit* lineEdit = new QLineEdit(); 
         lineEdit->setText(QString("I am the line edit at (%1, %2)").arg(i).arg(j)); 
         layout->addWidget(lineEdit, i, j); 
         if (j % 10 == 0) { 
          // Do not block the UI thread while the UI is being assembled. 
          qApp->processEvents(); 
         } 
        } 
    } 
    
    // The layout will be calculated only once, here: 
    
    scrollArea->setWidget(widget); 
    widget->show(); 
    
  • 如果不工作,创建具有参考可视矩形的event filter。事件过滤是一种非常有用的技术,您可以在其中拦截针对一个或多个小部件的事件,并决定是否应在处理之前丢弃这些事件。

    就你而言,当你拦截QPaintEvent时,检查目标控件是否与可见矩形相交。如果是这样,请将事件传递给目标小部件。如果没有,则丢弃该事件。

    我不知道你如何滚动你的UI的细节,所以我离开计算可见的矩形由你决定。事件过滤器代码将是这样的。

    bool MyClass::eventFilter(QObject *obj, QEvent *event) 
    { 
        if (event->type() == QEvent::Paint) { 
         if (QWidget* widget = qobject_cast<QWidget*>(object)) { 
          QRect visibleRectangle = somehowGetVisibleRectangle(); 
          if (visibleRectangle.intersects(widget->geometry())) { 
           return false; 
          } else { 
           // Returning true means "drop this event." 
           return true; 
          } 
         } 
        } 
    
        // Assuming MyClass extends QWidget. Adjust as necessary. 
        return QWidget::eventFilter(obj, event); 
    } 
    
  • 作为最后的手段,重新布局使用QGraphicsSceneQGraphicsWidgetQGraphicsGridLayoutQGraphicsView你的UI。场景图可能会更好地放弃不必要的UI重绘。

+0

谢谢您的详细解答!在第一次读,我衷心感到,你应该得到那些宝贵的50分;) 关于第一点:是的,我在设计器中创建了一个QScrollArea,它自动给ScrollAreaWidget作为QScrollArea的孩子。我已经将QScrollArea作为我的中心部件。 现在,当我启动应用程序并按下一个按钮,在ScrollAreaWidget的QFrame中添加指定的小部件时,我得到了巨大的CPU活动,我必须等待大约2分钟才能启用窗口。即使在这之后,假设一个函数显示一个MessageBox然后它不起作用 – 2013-03-13 09:11:25

+0

关于第三点:我完全不知道这些Widgets是什么! – 2013-03-13 09:23:29

+1

所以,你的问题似乎是组装UI,而不是在它完成后与它一起生活。我写了一个快速程序,将10.000行编辑添加到窗口。看看是否有帮助:https://gist.github.com/anonymous/fe8c343763db96ded195 – andref 2013-03-13 15:15:40

1

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

+0

我不确定这是正确的方法! 想象一下,除QTableWidget及其项目外,QLineEdit对象会占用多余的内存。 另外我已经开发了大部分用于QLineEdit的软件。 现在改变它来容纳QTableWidget对我来说将是一个巨大的痛苦。 我正在使用QLineEdit&QLabel的当前组合,这使得我的界面看起来很干净,尽管与QTableWidget相比,用户将能够看到更少的数据,我对此感到满意。 – 2013-03-08 14:00:31

+1

@CAD_coding你误会了我。你不**需要创建QLineEdit和QLabel来使用QTableWidget。你创建QTableWidget并用数据填充它。将要保留的单元格设置为“不可编辑”标签。保留其余的默认值(可编辑)。而已。 QTableWidget将自己负责为正在选择编辑的单元格提供编辑器(通过用户单击或调用editItem)。将不需要500 QLineEdit。 – user2116939 2013-03-08 14:05:53

+0

好的,也许我没有仔细阅读你的答案,对不起! 但我已经设计了我的QLineEdit&QLabel。再加上QLineEdit给我的一些属性没有找到像Validator这样的QTableWidget。 那么你能告诉我怎么去做问题中的问题吗? – 2013-03-11 10:00:01