0

私のプロジェクトでは、1 つの 16x16 グリッド レイアウトに 256 個の小さなプッシュボタンがあります。(ええ、永遠にかかりました。) 私のプログラムの編集と実行は非常に遅いです。また、何らかの奇妙な理由で、Qt ではどのボタンも有効にできませんが、横にある他のボタンは問題なく動作しますか?

たくさんのボタンを使わずに、グリッドのどの四角がクリックされたかを判断する簡単な方法はありますか? (画像の上でカーソルをたどるのと同じように?)

また、グリッドの各「四角」をクリックすると、それが「選択」になり、選択された唯一の「四角」である必要があります。(巨大なチェス盤のように考えてください)

ここに写真があります:http://gyazo.com/988cdbb59b3d1f1873c41bf91b1408fd

後で、54x54 サイズのグリッド (2916 ボタン) に対してこれを再度実行する必要がありますが、ボタンごとに実行したくありません。

お時間をいただきありがとうございます。私の質問を理解していただければ幸いです:)

4

3 に答える 3

1

ボタンの外観が本当に必要ない場合は、カスタム paintEvent を実装し、必要なサイズのグリッドを (ウィジェットのサイズを考慮して) レンダリングする QWidget サブクラスを作成します。次に、マウス イベント (上、下、移動など) で、どのグリッド項目がクリックされたかを単純な数式で計算できます。セルをさまざまな色でレンダリングして、選択または強調表示を示すことができます。

PS:実装からいくつかのコードを投稿したいのですが(これを2、3回行っています)、ソースコードは私の古い会社にあります:)

于 2013-09-02T08:24:54.737 に答える
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 は他の QGraphicsPixmapItem の上に表示されません

于 2013-08-29T11:05:16.540 に答える
0

ボタンを簡単に追加できるようにするには、独自の QGridLayout を作成するだけです。別の質問への回答を投稿し、カスタムメイドの QGridLayout に一連のウィジェットを順番に入力する方法を示しました。指定した列の最大数に従って、ボタンが追加されます。(注: これは非常に大まかな例ですが、始めるには十分です)

この例では、16 列のカスタム グリッド レイアウトを作成し、ボタンを追加するだけです。

どのボタンが押されたかを調べる (そして接続を容易にする) には、QSignalMapperを使用できます。

ラグを調査するために、アプリケーションの (GDI-/User-) ハンドルの量を確認できます (たとえば、ProcessExplorer を使用)。ハンドル数は 10.000 を超えてはなりません。

プッシュボタンを有効にできない理由がわかりません。

于 2013-08-20T05:56:26.023 に答える