2011-04-21 137 views
2

我已經有了一個空白區佈局,並且其中有一個固定大小的GtkDrawingArea。該層次結構的當前相關部分是:父窗口小部件中的中心固定大小的GtkDrawingArea小部件

GtkWindow > GtkVBox > GtkHPaned > GtkViewport > GtkAlignment > GtkFixed > GtkDrawingArea 

目前,GtkFixed小部件繪製在GtkViewport的左上角。但是,如果GtkFixed(以及它的唯一子節點,GtkDrawingArea)在GtkViewport中居中(當然,除了當窗口小部件被壓縮到不適合它的點時,我真的很喜歡它內容和滾動條出現)。

完成此操作的最佳方法是什麼? (我使用pygtk的做實際的應用邏輯,但是這應該是一個普遍問題,GTK)

下面是一個代表性的代碼示例:

import gtk 

class Controller: 

    def on_window1_destroy(self, widget, data=None): 
     gtk.main_quit() 

    def __init__(self): 
     self.builder = gtk.Builder() 
     self.builder.add_from_file("sample.glade") 
     self.window = self.builder.get_object("window1") 
     self.builder.connect_signals(self) 

    def on_drawingarea1_expose_event(self, widget, event): 
     cr = widget.window.cairo_create() 
     cr.set_source_rgb(0,0,0) 
     cr.paint() 
     return True 

if __name__ == "__main__": 
    client = Controller() 
    client.window.show() 
    gtk.main() 

並用相同的問題的樣本空地文件:

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <requires lib="gtk+" version="2.16"/> 
    <!-- interface-naming-policy project-wide --> 
    <object class="GtkWindow" id="window1"> 
    <signal name="destroy" handler="on_window1_destroy"/> 
    <child> 
     <object class="GtkVBox" id="vbox1"> 
     <property name="visible">True</property> 
     <child> 
      <object class="GtkHPaned" id="hpaned1"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <child> 
       <object class="GtkLabel" id="label1"> 
       <property name="visible">True</property> 
       <property name="label" translatable="yes">label</property> 
       </object> 
       <packing> 
       <property name="resize">False</property> 
       <property name="shrink">True</property> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkScrolledWindow" id="scrolledwindow1"> 
       <property name="visible">True</property> 
       <property name="can_focus">True</property> 
       <property name="hscrollbar_policy">automatic</property> 
       <property name="vscrollbar_policy">automatic</property> 
       <child> 
        <object class="GtkAlignment" id="alignment1"> 
        <property name="visible">True</property> 
        <child> 
         <object class="GtkFixed" id="fixed1"> 
         <property name="width_request">300</property> 
         <property name="height_request">300</property> 
         <property name="visible">True</property> 
         <child> 
          <object class="GtkDrawingArea" id="drawingarea1"> 
          <property name="width_request">300</property> 
          <property name="height_request">300</property> 
          <property name="visible">True</property> 
          <signal name="expose_event" handler="on_drawingarea1_expose_event"/> 
          </object> 
         </child> 
         </object> 
        </child> 
        </object> 
       </child> 
       </object> 
       <packing> 
       <property name="resize">True</property> 
       <property name="shrink">True</property> 
       </packing> 
      </child> 
      </object> 
      <packing> 
      <property name="position">0</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

最後一點......這個問題的樣本圖像... Screeshot @ imgur

回答

5

在GTK 2.x中,添加一個GtkAlignment作爲您希望居中和對齊0.5(禁用填充)的父項。

在3.x中,所有小部件都有xalign和yalign屬性,設置爲CENTER。

更新:從示例glade文件中,問題是填充未禁用;我懶得去查看之前調用的屬性,在GtkAlignment中這是xscale = 0.0 yscale = 0.0,這意味着不會擴展孩子以填充可用空間。默認xscale = 1.0 yscale = 1.0意味着孩子將填充可用空間,因此居中不起任何作用。

在樣本Glade文件中,我還必須執行「添加父 - >視口」以在滾動窗口和對齊之間添加視口。你應該在控制檯上發出警告。

+0

我曾嘗試GtkAlignment,因爲您之前描述爲GtkFixed的父項,並未將小部件居中。 – sleepynate 2011-04-24 21:00:30

+0

您可能需要發佈glade文件,以便人們可以看一看。 – 2011-04-25 02:12:34

+0

我發佈了一個示例glade文件和一個匹配的python腳本,它描繪了我想保持居中黑色的區域。理想情況下,黑色繪圖區域將保持居中在其GtkViewport中。 – sleepynate 2011-04-25 15:43:55

0

固定將使用所有SP可用的ace,你需要在這裏獲得調整大小的事件在父母之一,無論是視口或固定,我的猜測是,視口將工作得更好,然後,獲得固定的大小,並將其移動的孩子根據孩子的大小和固定的大小。

您可以通過Viewport,獲取子窗口小部件或從DrawingArea獲取父母。

+0

GtkFixed在調整大小時保持爲固定大小。 GtkViewport是可以擴展/收縮的,我想將固定在它的中心,就像它一樣。 – sleepynate 2011-04-24 21:02:09

相關問題