2013-08-20 7 views
0

내 프로젝트에는 16x16 그리드 레이아웃 하나에 256 개의 작은 푸시 버튼이 있습니다. (예, 영원히 걸렸습니다.) 지금 내 프로그램을 편집하고 실행하는 것은 매우 어려움이 있습니다. 또한 몇 가지 이상한 이유 때문에 Qt에서 버튼을 활성화 할 수는 없지만 측면의 다른 버튼은 정상적으로 작동합니까?푸시 버튼의 거대한 "그리드"가 지루하고 버튼을 활성화 할 수 없습니다.

버튼을 사용하지 않고 클릭 한 그리드의 사각형을 쉽게 확인할 수있는 방법이 있습니까? (이미지 위에 커서를 올린 것처럼?)

또한 격자의 "사각형"을 클릭하면 "선택"이되고 선택한 유일한 "사각형"이어야합니다. 나는 54x54 크기의 그리드 다시 (2916 개 버튼)이 작업을 수행해야합니다, 나중에 http://gyazo.com/988cdbb59b3d1f1873c41bf91b1408fd

내가 정말 싶지 않은 : 여기

는 그림이다 (거대한 체스 보드처럼 생각해) 그것을 버튼으로해라. 시간에 대한

덕분에, 나는 당신이 내 질문 :

+0

는 관련 코드를 보여주세요 내 된 회사 :)에있다. 또한 QGraphicsView는 경우에 따라 더 적합 할 수 있습니다. – Mat

+0

관련 코드가 없습니다. 그냥 내 질문을 읽으십시오. 코딩 문제가 아닙니다. – mrg95

+1

"끔찍하게 뒤지지 않는"물건이 있고 이미지 만 제공합니다. 우리가 그걸 어떻게 도울 수 있니?"버튼 하나로 버튼을 사용하고 싶지 않습니다."기존 코드의 구조에 의문을 제기합니다. "쉬운 방법이 있습니까 [...]?" 맞습니다. 수학은 매우 간단하지만 올바른 솔루션이 아닙니다. 해결책은 지연이 발생하는 모든 문제를 해결하는 것입니다 (또는 QGraphicsView _could_는 더 좋을 수는 있지만 당신이 무엇인지에 대한 세부 사항을 알지 못하고 말하지는 않습니다). 현재하고 있습니다.) – Mat

답변

0

당신은 그냥 쉽게 버튼을 추가 할 수 있도록하기 위해 자신의 QGridLayout을 만들 이해를 바랍니다. 나는 answer to another question이라는 글을 올리며, 커스텀으로 제작 된 QGridLayout에 일련의 위젯을 순차적으로 채워 넣는 방법을 보여 주었다. 단추는 지정한 최대 열 수에 따라 추가됩니다. (참고 : 이것은 아주 거친 예제이지만 시작하기에 충분합니다.)

예제에서 16 열로 사용자 정의 그리드 레이아웃을 만들고 버튼을 추가하면됩니다.

어떤 버튼을 눌렀는지 확인하려면 (연결하기 쉽도록) QSignalMapper을 사용할 수 있습니다.

지연을 조사하려면 응용 프로그램 (예 : ProcessExplorer 사용)의 (GDI-/User-) 핸들 양을 확인할 수 있습니다. 핸들 수는 10.000보다 커야합니다.

푸시 버튼을 사용할 수없는 이유를 모르겠습니다.

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

+0

C++을 사용하고 있습니다. 나는 그것을 제목에 넣었지 만, 멍청한 운영자는 항상 그것을 꺼냅니다. 나를 미치게해라. – mrg95

+0

아, 미안, 나는 그것을 보지 못했다. 어쨌든, 주어진 파이썬 코드 (및 주어진 링크의 코드)로부터 아이디어를 얻고이를 C++로 번역 할 수 있습니다. Python 코드를 시험해보고 싶다면 : Python2.6, PyQt4.7, PyDev로 Eclipse를 사용하고 있습니다. 행운을 빕니다. – Aleksandar

1

을 내가는 QWidget 서브 클래스를 만들 것이라고 사용자 정의 paintEvent를 구현하고 필요한 크기의 격자를 렌더링합니다 (위젯 크기를 고려함). 그런 다음 마우스 이벤트 (위, 아래, 이동 등)에서 간단한 공식으로 클릭 한 그리드 항목을 계산할 수 있습니다. 선택이나 강조 표시를 위해 다른 색상의 셀을 렌더링 할 수 있습니다.

P.S.:I 정말 내 구현에서 일부 코드를 게시하고자하는 (나는이 두 개 또는 세 번 수행 한)하지만 소스 코드는