[Qt-jambi-interest] Widget Size 0? How to show large pixmpa in a small viewport without loosing pixmap data

Dawid Sip vad at poczta.onet.pl
Thu Apr 17 16:22:01 CEST 2008


Hi,
the solution with the overriden resizeEvent of the GraphicsView was a 
nice learning example but unfortunately it is not exactly what I'am 
looking for. I want the scene (or Pixmap) to fit into the GraphicsView 
but I dont want to rescale it and loose data. Thus, what I need is to 
somehow rescale the scene in which the pixmap resolution stays untougched.
For example, I work with large images (~2500x2000) and I want to show 
them in graphicsView which is ~400x300, scaled so the image fits into 
that 300x400 view and the image resolution stays 2500x2000(inside pixmap 
item) and when I click in the middle of that GraphicsView -pos(150,200) 
I can transform this down to the item and get somethink like 
pos(1250x1000). So I somehow need to adjust the projection. I think this 
is an issue of the viewport. I think I could achieve this by changing 
the viewport to QGLWidget and with help of some wrapper lib. like JOGL 
adjust the viewport/frustum, but I'd rather not use OpenGL in my 
application. So is this the only way or can I still do this with the 
default QWidget as viewport?

Sow the question is: "How to show large pixmpa in a small viewport 
without loosing pixmap data"

Could somebody please point me in the right direction?

Dawid
> Dawid Sip wrote:
>> I understand that the resizeEvent is propageted like this:
>> MainWindow
>>     ->Splitter
>>        -->dockWidget
>>           --->GraphicsView
>>              ---->GraphicsScene
>>                 ----->Image
>>
>> So my guess is that I have to reimplement resizeEvent of the 
>> GraphicsScene, where i can get the size of the parent - GraphicsView 
>> and with this size i can set the size of the Image?
>>   
>
> The size of graphics scene is not really related as the view can view 
> any part of the scene you want. The layout system will make sure that 
> the size of the view is connected to the size of the dock widget 
> (which again is controlled by the splitter), so you would only need to 
> listen to the resize event of the view and your application will work 
> regardless of how the widget hierarchy looks. I've modified your 
> example a little to show you how this might be done. Please note that 
> this is probably not your most highly optimized example (you might 
> want to turn off opaque resizing for the splitters to avoid big 
> garbage collection steps and to increase the performance), but it 
> shows you the idea. (Also, this won't work if you add any transform to 
> the graphics view of course, in fact most of the things you can do 
> with a graphics view will break it, but I wanted to recreate the 
> hierarchy in your drawing above.)
>
> Just replace the hard coded path of the icon to something you have 
> available.
>
> Hope this is what you were looking for!
>
> -- Eskil
>
>
> ------------------------------------------------------------------------
>
> import com.trolltech.qt.core.Qt.Orientation;
> import com.trolltech.qt.gui.*;
>
> class MyDockWidget extends QDockWidget {
> 	
> 	public MyDockWidget() {
> 		
> 		QGraphicsScene scene = new QGraphicsScene();	
> 		final QPixmap pixmap = new QPixmap("classpath:com/trolltech/images/qt-logo.png");
> 		final QGraphicsPixmapItem item = scene.addPixmap(pixmap);
> 		
> 		QGraphicsView view = new QGraphicsView() {
> 			
> 			@Override
> 			protected void resizeEvent(QResizeEvent e) {
> 				item.setPixmap(pixmap.scaled(e.size()));
> 				super.resizeEvent(e);
> 			}			
> 		};
> 		view.setScene(scene);
>
> 		setWidget(view);		
> 	}
> 	
> }
>
> public class guiSplit extends QMainWindow{
>
>     Ui_guiSplitClass ui = new Ui_guiSplitClass();
>     QSplitter spliterV = new QSplitter(Orientation.Vertical);
>     QSplitter spliterH = new QSplitter(Orientation.Horizontal);
>     private int imageInCentralWidget = 0;
>     
>     public static void main(String[] args) {
>         QApplication.initialize(args);
>         guiSplit testguiSplit = new guiSplit();
>         testguiSplit.show();
>         QApplication.exec();
>     }
>     
>     public guiSplit(){
>         ui.setupUi(this);
>         
>         spliterV.addWidget(spliterH);
>         
>         QWidget w = new QWidget();        
>         QHBoxLayout layout = new QHBoxLayout(w);
>         layout.addWidget(spliterV);
>         
>         setCentralWidget(w);
>     }
>     
>     public guiSplit(QWidget parent){
>     	super(parent);
>         ui.setupUi(this);
>     }
>     
>     QDockWidget dockWid;
>     public void on_actionAddDockWid_triggered() {
>     	if(imageInCentralWidget==3) return;
>     	
>     	System.err.println("\n\n\n");
>     	dockWid = new MyDockWidget();
>         dockWid.setObjectName("dockWid"+(++imageInCentralWidget));
>         dockWid.setFeatures(com.trolltech.qt.gui.QDockWidget.DockWidgetFeature.createQFlags(com.trolltech.qt.gui.QDockWidget.DockWidgetFeature.NoDockWidgetFeatures));
>         
>         QApplication.processEvents();
>         
>         switch(imageInCentralWidget){
> 	     	case 1:
> 	     		spliterH.addWidget(dockWid);
> 	       		break;
> 	       	case 2:
> 	       		spliterH.addWidget(dockWid);
> 	       		break;
> 	       	case 3:
> 	       		spliterV.addWidget(dockWid);
> 	       		break;
>         }        
>     }
> }
>   



More information about the Qt-jambi-interest mailing list