2016-07-22 5 views
0

Мне нужно создать OR Gate, используя 4 изображения (3 строки и символ Gate). Это требует перекрытия изображений, помещенных в ячейки в wxGridBagSizer. Как я могу это достичь?Как совместить изображения wxStaticBitmap в wxGridBagSizer с помощью wxFormBuilder в wxPython

Attempt using wxFormBuilder

Я пытаюсь установить отрицательную vgap и hgap используя wxFormBuilder перекрываться изображения, но wxFormBuilder не принимает отрицательные значения.

Тогда я попытался написать сырой код для достижения той же:

self.widgetSizer = wx.GridBagSizer(hgap=-6,vgap=-20) 


self.orGateImage = wx.StaticBitmap(self, -1, self.orGateImageBitmap, style=wx.BITMAP_TYPE_PNG) 
self.LineImageOffA = wx.StaticBitmap(self, -1, self.LineImageOffBitmap, style=wx.BITMAP_TYPE_PNG) 
self.LineImageOffB = wx.StaticBitmap(self, -1, self.LineImageOffBitmap, style=wx.BITMAP_TYPE_PNG) 
self.LineImageOffX = wx.StaticBitmap(self, -1, self.LineImageOffBitmap, style=wx.BITMAP_TYPE_PNG) 


self.LetterAImage = wx.StaticBitmap(self, -1, self.LetterAImageBitmap, style=wx.BITMAP_TYPE_PNG) 
self.LetterBImage = wx.StaticBitmap(self, -1, self.LetterBImageBitmap, style=wx.BITMAP_TYPE_PNG) 
self.LetterXImage = wx.StaticBitmap(self, -1, self.LetterXImageBitmap, style=wx.BITMAP_TYPE_PNG) 


self.widgetSizer.Add(self.LineImageOffA, pos=(0,1), border=10) 
self.widgetSizer.Add(self.LineImageOffB, pos=(2,1), border=2) 
self.widgetSizer.Add(self.LineImageOffX, pos=(1,3), flag=wx.ALIGN_CENTER,border=2) 
self.widgetSizer.Add(self.orGateImage, pos=(1,2), border=10) 
self.widgetSizer.Add(self.LetterAImage, pos=(0,0), border=10) 
self.widgetSizer.Add(self.LetterBImage, pos=(2,0), border=10) 
self.widgetSizer.Add(self.LetterXImage, pos=(1,4), flag=wx.ALIGN_CENTER, border=10) 

self.frame.fSizer.Layout() 

И это сработало. Я мог бы получить следующий вывод:

Attempt using raw code

Пожалуйста, помогите мне достичь этого с помощью wxFormBuilder как мне нужно, чтобы создать такие элементы быстро в моем проекте. Есть ли другая альтернатива, чтобы это сделать?

Код, сгенерированный wxFormBuilder выглядит следующим образом:

MyFrame1::MyFrame1(wxWindow* parent, wxWindowID id, const wxString&  title, const wxPoint& pos, const wxSize& size, long style) : wxFrame(parent, id, title, pos, size, style) 
{ 
    this->SetSizeHints(wxDefaultSize, wxDefaultSize); 

    wxBoxSizer* bSizer1; 
    bSizer1 = new wxBoxSizer(wxVERTICAL); 

    wxGridBagSizer* gbSizer1; 
    gbSizer1 = new wxGridBagSizer(0, 0); 
    gbSizer1->SetFlexibleDirection(wxBOTH); 
    gbSizer1->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED); 

    m_bitmap1 = new wxStaticBitmap(this, wxID_ANY, wxBitmap(wxT("../../home/ece/Desktop/scripts/fromPI/GREEN_LINE_OFF_SMALL.png"), wxBITMAP_TYPE_ANY), wxDefaultPosition, wxSize(85,5), 0); 
    gbSizer1->Add(m_bitmap1, wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL, 5); 

    m_bitmap2 = new wxStaticBitmap(this, wxID_ANY, wxBitmap(wxT("../../home/ece/Desktop/scripts/fromPI/GREEN_LINE_OFF_SMALL.png"), wxBITMAP_TYPE_ANY), wxDefaultPosition, wxSize(85,5), 0); 
    gbSizer1->Add(m_bitmap2, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALL, 5); 

    m_bitmap3 = new wxStaticBitmap(this, wxID_ANY, wxBitmap(wxT("../../home/ece/Desktop/scripts/fromPI/OR_GATE_SMALL.png"), wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, 0); 
    gbSizer1->Add(m_bitmap3, wxGBPosition(1, 2), wxGBSpan(1, 1), wxALL, 5); 

    m_bitmap4 = new wxStaticBitmap(this, wxID_ANY, wxBitmap(wxT("../../home/ece/Desktop/scripts/fromPI/GREEN_LINE_OFF_SMALL.png"), wxBITMAP_TYPE_ANY), wxDefaultPosition, wxSize(85,5), 0); 
    gbSizer1->Add(m_bitmap4, wxGBPosition(1, 3), wxGBSpan(1, 1), wxALIGN_CENTER|wxALL, 5); 

    bSizer1->Add(gbSizer1, 1, wxEXPAND, 5); 

    this->SetSizer(bSizer1); 
    this->Layout(); 
} 

MyFrame1::~MyFrame1() 
{ 
} 
+0

какой код был создан wxFB? Вы можете сравнить? – Igor

+0

также из любопытства, почему вы хотите использовать GridBagSizer? Неужели BoxSizer недостаточно? – Igor

+0

@Igor: Я отредактировал и добавил код, созданный wxFB. И GridBagSizer позволяет мне устанавливать элементы в строках и столбцах и настраивать каждую ячейку. – SMD

ответ

1

WxWidgets не поддерживает перекрывающихся родного брата виджетов (ваш wx.StaticBitmaps в данном случае) и поведение, что происходит, когда вы пытаетесь сделать это не определено. Кроме того, sizers не предназначены для перекрытия предметов, что противоречит их основной цели IMO.

Однако вы можете легко нарисовать растровые изображения самостоятельно, не используя виджет для каждого из них, и чтобы они перекрывали столько или меньше, сколько вам нужно. Для этого вы можете обработать метод EVT_PAINT в классе на основе wx.Window или wx.Panel и нарисовать растровые изображения в этом обработчике краски, а затем поместить экземпляр этого окна в свой фрейм. Существует множество примеров рисования в обработчике краски в демонстрации и различных учебных пособиях.