簡體   English   中英

將固定大小的GtkDrawingArea小部件居中在父小部件內

[英]Center fixed-size GtkDrawingArea widget inside of parent widget

我有一個空地布局,其中有一個固定大小的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

在GTK 2.x中,將GtkAlignment添加為要居中並對齊0.5(禁用填充)的任何對象的父對象。

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

更新:從示例林間空地文件,問題是未禁用填充; 我太懶了,無法查找之前調用的屬性,在GtkAlignment中,這是xscale = 0.0 yscale = 0.0,這意味着不要擴展子級以填充可用空間。 默認的xscale = 1.0 yscale = 1.0表示子級將填充可用空間,因此居中不會執行任何操作。

在示例Glade文件中,我還必須執行“添加父項->視口”以在滾動窗口和路線之間添加視口。 您應該在控制台上對此進行警告。

固定將使用所有可用空間,您需要在其中捕捉父級之一的調整大小事件,無論是視口還是固定視口,我都認為視口將更好地工作,然后獲取固定視口的大小並移動根據孩子的大小和固定的大小而定。

您可以使用視口(獲取子窗口小部件)或通過DrawingArea(獲取父母)進行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM