Найти - Пользователи
Полная версия: Создание элемента для изменения размера QGraphicsView и соседних виджетов
Начало » GUI » Создание элемента для изменения размера QGraphicsView и соседних виджетов
1
wizard_master
Добрый день товарищи программисты!
Имеется форма с QGraphicsView, QToolBox, QTextBrowser
QGraphicsView и QToolBox расположены в горизонтально лейоуте,
этот лейоут и QTextBrowser в вертикальном лейоуте.

Пытаюсь создать элемент в правом нижнем углу (отмечен стрелкой на скриншоте) QGraphicsView, потянув мышкой за который можно было-бы одновременно изменять размеры всех трех виджетов в пределах их мин/макс размеров.
Форму создавал в Designer-ре, компилируется UIC в момент инициализации.
Думал сначала создать QGraphicsItem, но подумал что потом этот класс может пригодиться для других виджетов.
Подскажите как лучше реализовать? Вот я пробовал разместить QPushButton, у которого родитель - QGraphicsView, но при вызове show() ни чего не отобразилось…

#класс для изменения границ виджетов ///
class WidgetResizer(QtGui.QPushButton):
	# при инициализации передаем ему родителя (на нем он будет размещаться),
	# Top -> bool сверху - 1, иначе снизу  (размещение)
	# Left -> bool слева - 1, иначе справа (размещение)
	# neighWidgets - список соседних виджетов, размеры которых будут тоже меняться.
	def __init__(self, parent, top, left, neighWidgets):
		QtGui.QPushButton.__init__(self, parent)
		self.top = bool(top)
		self.left = bool(left)
		self.neighWidgets = neighWidgets
		self.maxX = self.parent().width()
		self.maxY = self.parent().height()
		self.setGeometry(150, 150, 24, 24)
		self.setIcon(QIcon(u":/ico/anchor_4362.png"))
		self.setIconSize(QSize(16, 16))
		self.setFlat(True)
		self.setMinimumSize(QSize(24, 24))
		self.setMaximumSize(QSize(24, 24))

здесь при инициализации окна создаем экземпляр WidgetResizer:
class MainWindow( QtGui.QMainWindow ):
	def setupUi(self, parent=None):
		#инициализация виджета
		QtGui.QWidget.__init__(self, parent)
		
		#загружаем данные из формы UI
		uiClass, qtBaseClass = uic.loadUiType("mainwindow.ui")
		
		#MainWindow.ui - теперь форма из файла ui, загруженного выше
		self.ui = uiClass()
		self.ui.setupUi(self)s
                self.ui.bMagnitOn.clicked.connect( self.MagnitOn )
		self.ui.bMagnitSettings.clicked.connect( self.MagnitSettings )
		self.ui.bShowAll.clicked.connect( self.ShowAll )
		self.ui.bZoom.clicked.connect( self.Zoom )
		self.ui.bDeblockAll.clicked.connect( self.DeblockAll )
		self.ui.bLayerSettings.clicked.connect( self.LayerSettings )
		self.ui.bOnOff.clicked.connect( self.OnOff )
		self.ui.bZoomToLayer.clicked.connect( self.ZoomToLayer )
		#указываем текущую закладку для табВиджета
		self.ui.mTab.setCurrentWidget(self.ui.tFile)
		self.showMaximized()
		self.ui.twLayers.setColumnWidth(0, 50)
		
		
	def __init__( self ):
		# Требуется Qt4 для инициализации пользовательского интерфейса
		#инициализируем майнформ как кувиджет
		QtGui.QWidget.__init__( self )
		self.setupUi( self )
		#!!!!!!!!!!!!!создаем ресайзер на мап канвасе
		self.mapCanvasResizer = WidgetResizer(self.ui.mapCanvas, 0, 0, [self.ui.toolBox, self.ui.tConsole])
                self.mapCanvasResizer.show()
wizard_master
Создать получилось, вот как теперь отслеживать перемещение при нажатой кнопке?


#класс для изменения границ виджетов ///
class WidgetResizer(QtGui.QPushButton):
	# neighWidgets - список соседних виджетов, размеры которых будут тоже меняться.
	def __init__(self, parent, top, left, neighWidgets):
		QtGui.QPushButton.__init__(self, parent)
		
		if top:
			self.curr_y = 0
		else:
			self.curr_y = self.parent().height() - 18
		
		if left:
			self.curr_x = 0
		else:
			self.curr_x = self.parent().width() - 16
		
		self.setIcon( QIcon(QPixmap(QString('ico/resizer.png'))) )
		self.setIconSize(QSize(16, 16))
		self.neighWidgets = neighWidgets
		self.setFlat(True)
		self.setMinimumSize(QSize(16, 16))
		self.setMaximumSize(QSize(16, 16))
		self.setGeometry( self.curr_x, self.curr_y, 16, 16 )
		self.show()
		
		self.pressed.connect( self.pushresize )
		self.released.connect( self.releaseresize )
		

self.mapCanvasResizer = WidgetResizer( self.ui.mapCanvas, False, False, [self.ui.toolBox, self.ui.tConsole])
reclosedev
wizard_master
Создать получилось, вот как теперь отслеживать перемещение при нажатой кнопке?
http://qt-project.org/doc/qt-4.8/qwidget.html#mouseMoveEvent
mousePressEvent
mouseReleaseEvent

wizard_master
QGraphicsView и QToolBox расположены в горизонтально лейоуте,
этот лейоут и QTextBrowser в вертикальном лейоуте.
Не пробовали QDockWidget?

Ни разу не видел такого контрола, чтобы все окна двигать, может это и удобно, но возможностей DockWidget всегда хватало.
wizard_master
reclosedev
Спасибо!
Нет, ДокВиджет не пробовал, но оставим на Н.З., ведь полезная штучка будет - этот ресайзер
В каком хочешь углу, в том и ставь.
Завтра отпишусь, что получилось.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB