Ich habe wxWidgets für die letzte Woche gelernt, sowohl mit IDEs und Schreiben von C++ - Code. Ich fange an zu verzweifeln, jemals etwas zu bekommen, das gut aussieht, da die Fähigkeit, Gegenstände zu positionieren, sehr begrenzt erscheint.Ist das mit wxWidgets möglich?
Ich portiere ein groß-ish Projekt von C++ Builder zu VStudio, aus Kostengründen. Ich habe einige Dialoge, die ich neu erstellen kann. Sie enthalten im Allgemeinen unterschiedliche Kombinationen von "Blöcken" von Eingaben - mangels eines besseren Wortes. Ich wählte wxWidgets für meine GUI, weil ich dachte, ich könnte die Dialoge im Code von Funktionen aufbauen, die eine Reihe des Formulars erzeugen. Zum Beispiel könnte ich in dem unten gezeigten Dialog die Funktionen CreateLabelEdit, CreateLabelCombo, CreateBoldLabel, etc. haben. Ich habe tatsächlich einen Erfolg in diesem Teil, schade aber nicht, den Dialog zu gestalten.
Hier sind einige der Design-Kriterien von dieser besonderen Form:
Alle Eingänge ausgerichtet sind links und unterschiedliche Breiten entsprechend ihrer Inhalte.
Die Eingabeetiketten sind alle richtig ausgerichtet.
Der Ausrichtungspunkt (dh. Die Breite des Spalts, die die Eingänge Etiketten enthält, ist das gleiche für alle Dialoge, und die Breiten der verschiedenen Eingänge als auch. Natürlich gibt es Ausnahmen!
Andere Arten von Etiketten werden an einem anderen Ort. BoldLabels in diesem Fall ausgerichtet.
Grundsätzlich möchte ich die Größe, Lage und Ausrichtung meiner Objekte steuern. Ist dies ein Fall für die falsche Einstellung für das Werkzeug mit Ich habe gewählt? Oder können diese Arten von Dingen sein mit diesem Tool durchgeführt?
Teillösung Ich habe versucht, mit Sizer gemischt absoluten Positionen verwenden und dass überhaupt nicht funktioniert.
Dann habe ich versucht, einen Flexgrid-Sizer zu verwenden, um einen Teil des Beispiels zu tun, Wenn ich einen der Blöcke dann kann ich mehrere Blöcke zusammenfügen. Es ist alles gut, außer wenn ich die Breite des ersten Spalts SetItemMinSize gesetzt, wie @VZ vorgeschlagen, dass Artikel verlieren es sizerflag Einstellungen:
form4::form4() :wxDialog(nullptr, wxID_ANY, "title")
{
wxSizerFlags flagT1(1);
flagT1.Align(wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT).Border(wxTOP | wxLEFT, 10);
wxSizerFlags flagT2(1);
flagT2.Align(wxALIGN_CENTER_VERTICAL).Border(wxTOP | wxLEFT, 10);
wxSizerFlags flagT3(1);
flagT3.Align(wxALIGN_CENTER_VERTICAL).Border(wxTOP | wxLEFT| wxRIGHT, 10);
wxBoxSizer* bSize = new wxBoxSizer(wxVERTICAL);
wxStaticText* _Text = new wxStaticText(this, wxID_ANY, "this should be bold");
wxFont _Font = _Text->GetFont();
_Font.MakeBold();
_Font.SetPixelSize(_Font.GetPixelSize()*1.1);
_Text->SetFont(_Font);
bSize->Add(_Text, wxSizerFlags().Border(wxTOP, 10).Center());
bSize->Add(new wxStaticText(this, wxID_ANY, "this should be bold"),
wxSizerFlags().Border(wxTOP, 10).Center());
wxFlexGridSizer* bSizer = new wxFlexGridSizer(3,0,0);
_Text = new wxStaticText(this, wxID_ANY, "bob");
// bSizer->SetItemMinSize(_Text, wxSize(150, -1)); //this has no effect here
bSizer->Add(_Text, flagT1);
bSizer->SetItemMinSize(_Text, wxSize(150, -1));// loses styling of flagT1
bSizer->Add(new wxTextCtrl(this, wxID_ANY, "default_value", wxDefaultPosition, wxSize(150, -1)), flagT2);
bSizer->Add(new wxStaticText(this, wxID_ANY, "cm", wxPoint(200, 20)), flagT3);
bSizer->Add(new wxStaticText(this, wxID_ANY, " longer"), flagT1);
bSizer->Add(new wxTextCtrl(this, wxID_ANY, "default_value2", wxPoint(-1, -1), wxSize(150, -1)), flagT2);
bSizer->Add(new wxStaticText(this, wxID_ANY, "cm", wxPoint(200, 20)), flagT3);
bSizer->Add(new wxStaticText(this, wxID_ANY, "bob"), flagT1);
bSizer->Add(new wxTextCtrl(this, wxID_ANY, "default_value3", wxPoint(-1, -1), wxSize(150, -1)), flagT2);
bSizer->Add(new wxStaticText(this, wxID_ANY, "cm", wxPoint(200, 20)), flagT3);
bSize->Add(bSizer);
bSize->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), wxSizerFlags(0).Border(wxALL, 10));
this->SetSizerAndFit(bSize);
// this->Layout();
this->Centre(wxBOTH);
}
erzeugt dies:
Machen Sie absolute Positionierung oder verwenden Sie einen Sizer für das Layout? – smcd
Versuchen Sie wxFormBuilder – macroland
@smcd, ich habe versucht, Sizers zu verwenden, wie die gesamte Dokumentation empfiehlt, aber jetzt denke ich, dass die Bereitstellung von Größen für die x-Komponenten und lassen Sizer die y-Komponente behandeln, die Lösung sein kann. – marcp