【问题标题】:Huge "Grid" of PushButtons lags awfully, buttons can't be enabled巨大的按钮“网格”严重滞后,无法启用按钮
【发布时间】:2013-08-20 05:30:47
【问题描述】:

在我的项目中,我在一个 16x16 网格布局中有 256 个微型按钮。 (是的,这需要很长时间。)现在编辑和运行我的程序非常滞后。另外,出于某种奇怪的原因,Qt 不允许我启用任何按钮,但旁边的其他按钮工作正常吗?

有没有什么简单的方法可以在没有一堆按钮的情况下确定点击了网格的哪个方格? (就像将光标移到图像上一样?)

此外,当单击网格的每个“正方形”时,它成为“选择”并且它必须是唯一选择的“正方形”。 (把它想象成一个巨大的棋盘)

这是一张照片:http://gyazo.com/988cdbb59b3d1f1873c41bf91b1408fd

稍后,我将需要为 54x54 大小的网格(2916 个按钮)再次执行此操作,我真的不想一个接一个地执行此操作。

感谢您的宝贵时间,希望您能理解我的问题:)

【问题讨论】:

  • 请出示相关代码。另外:QGraphicsView 在某些情况下可能更合适。
  • 没有相关代码。只需阅读我的问题。这不是编码问题。
  • 你有一些“严重滞后”的东西,你只提供了一张图片。我们应该如何帮助你? “我真的不想一个接一个地做”引起了对现有代码结构的怀疑。 “有没有简单的方法[...]?”是的,数学很简单,但这不是正确的解决方案 - 解决方案是修复导致滞后的任何问题(或使用不同的技术,即 QGraphicsView 可能更好,但不知道就告诉您当前正在做的事情的详细信息。)
  • 认真的吗?我需要为您上传延迟视频吗?在我的程序中使用其他功能并在 QtDesigner 模式下编辑它是滞后的。一个按钮一个按钮意味着我一次一个地放置、调整大小、排序、命名和移动每个按钮。我有这么多按钮,我的程序很滞后。我正在寻找一种更简单的替代方法来制作巨大的按钮网格。
  • 我说的是代码,除非 Qt Designer 允许您定义一个适当的数组或按钮网格,该数组或网格保存在适当的集合类型中,而不是UI 类中有 100 个不同的自变量。我已经给你提供了替代方案。第二个是使用按钮的合理结构自己编写该小部件。

标签: c++ qt grid lag qpushbutton


【解决方案1】:

你可以用这个简单的方法来做,我已经用代码解释了几乎所有的东西,但是如果你对它有任何疑问,请随时提出,如果它解决了你的问题,请接受这个答案:)

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import *
from PyQt4.QtCore import * 

class DrawImage(QMainWindow): 
    def __init__(self, parent=None):
        super(QMainWindow, self).__init__(parent)
        self.setWindowTitle('Select Window')

        #you can set grid size here ... 8x8, 16x16 , for bigger numbers (54x54) be sure your image is big enough, because QWidget can't be smaller then ~20 pixels
        self.gridSize = 16

        mainWidget = QWidget()
        self.setCentralWidget(mainWidget)
        self.scene = QGraphicsScene()
        view = QGraphicsView(self.scene)
        layout = QVBoxLayout()
        layout.addWidget(view)
        mainWidget.setLayout(layout)
        self.image = QImage('image.JPG')# put your image name here, image (suppose to be grid) must be at the same folder or put full path
        pixmapItem = QGraphicsPixmapItem(QPixmap(self.image), None, self.scene)
        pixmapItem.mousePressEvent = self.pixelSelect


    def pixelSelect( self, event ):
        #add whatever you want to this widget,any functionality or you can add image for example, I've simply colored it
        wdg = QWidget()
        layout = QVBoxLayout()
        palette =  QPalette(wdg.palette())
        palette.setBrush(QPalette.Background, QColor(200,255,255))
        wdg.setPalette(palette)
        wdg.setLayout(layout)
        self.scene.addWidget(wdg)

        #calculate size and position for added widget
        imageSize = self.image.size()
        width = imageSize.width()
        height = imageSize.height() 

        #size
        wgWidth = float(width)/self.gridSize  
        wgHeight =  float(height)/self.gridSize
        wdg.setFixedSize(wgWidth,wgHeight)

        #position       
        wgXpos = int(event.pos().x()/wgWidth) * wgWidth
        wgYpos = int(event.pos().y()/wgHeight) * wgHeight
        wdg.move(wgXpos,  wgYpos)

        #which square is clicked?
        print "square at row ", int(event.pos().y()/wgHeight)+1,", column ",int(event.pos().x()/wgWidth)+1, "is clicked"

def main():
    app = QtGui.QApplication(sys.argv)
    form = DrawImage()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

另外,如果您想在网格图像上显示简单的方形图像,请查看我的问题/解决方案:QGraphicsPixmapItem won't show over the other QGraphicsPixmapItem

【讨论】:

  • 我正在使用 C++。我把它放在标题中,但该死的版主总是把它拿出来。把我逼疯了
  • 哦,抱歉,我没看到。无论如何,您可以从给定的 Python 代码(以及给定链接中的代码)中获得一个想法,并将其转换为 C++。如果您想尝试 Python 代码:我正在使用 Python2.6、PyQt4.7、Eclipse 和 PyDev。祝你好运。
【解决方案2】:

如果您真的不需要按钮的外观,我将创建一个 QWidget 子类,该子类实现自定义的paintEvent 并呈现所需大小的网格(考虑到小部件的大小)。然后,在鼠标事件(向上、向下、移动等)中,您可以使用简单的公式计算单击了哪个网格项。您可以用不同的颜色渲染单元格以指示选择或突出显示。

P.S.:我真的很想从我的实现中发布一些代码(我已经这样做了两三次)但是源代码在我的老公司:)

【讨论】:

    【解决方案3】:

    您只需创建自己的 QGridLayout 即可轻松添加按钮。 我发布了一个answer to another question,向您展示了如何用一堆小部件顺序填充定制的 QGridLayout。根据您指定的最大列数添加按钮。 (注:这只是一个非常粗略的例子,但足以开始)

    在您的示例中,您将创建具有 16 列的自定义网格布局并简单地添加您的按钮。

    要找出按下了哪个按钮(并使连接更容易),您可以使用QSignalMapper

    为了调查延迟,您可以检查应用程序的(GDI-/User-)句柄数量(例如使用 ProcessExplorer)。句柄数不应超过 10.000。

    我不知道你为什么不能启用按钮。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-24
      • 2012-12-28
      • 2017-09-19
      • 2018-07-05
      • 2019-01-20
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多