<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Styles in eigene Gui implementieren]]></title><description><![CDATA[<p>Hallo, ich schreibe gerade eine GUI in OpenGL und C++ die sich am Aufbau des .Net Framework von MS orientiert. Die ganzen Steuerelemente werden im Moment noch im Code erzeugt, später sollen diese auch aus einer XML-Datei einlesbar sein. Die Frage ist jetzt wie ich verschiedene Styles implementiere. Die Styles sollen sehr primitiv sein, also nur Dinge wie Einschrückungen, Farben, Eckradien usw. beinhalten. Im Moment habe ich für jedes Steuerelement eine eigene Styleklasse, die die selben Design-Eigenschaften wie das Steuerelement enthält.<br />
Problem: Doppelter Code, sehr Wartungsintensiv bei Änderungen und gefällt mir einfach nicht so wirklich. Gibt es evtl. eine elegantere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268961/styles-in-eigene-gui-implementieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 15:43:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268961.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Jun 2010 20:39:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Wed, 16 Jun 2010 20:39:33 GMT]]></title><description><![CDATA[<p>Hallo, ich schreibe gerade eine GUI in OpenGL und C++ die sich am Aufbau des .Net Framework von MS orientiert. Die ganzen Steuerelemente werden im Moment noch im Code erzeugt, später sollen diese auch aus einer XML-Datei einlesbar sein. Die Frage ist jetzt wie ich verschiedene Styles implementiere. Die Styles sollen sehr primitiv sein, also nur Dinge wie Einschrückungen, Farben, Eckradien usw. beinhalten. Im Moment habe ich für jedes Steuerelement eine eigene Styleklasse, die die selben Design-Eigenschaften wie das Steuerelement enthält.<br />
Problem: Doppelter Code, sehr Wartungsintensiv bei Änderungen und gefällt mir einfach nicht so wirklich. Gibt es evtl. eine elegantere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1913569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1913569</guid><dc:creator><![CDATA[Stdent83]]></dc:creator><pubDate>Wed, 16 Jun 2010 20:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Wed, 16 Jun 2010 20:47:07 GMT]]></title><description><![CDATA[<p>Ich erkenne das Problem nicht so wirklich. Wenn jede Klasse die gleichen Möglichkeiten hat die Eigenschaften zu verändern, so würde doch sowas reichen:</p>
<pre><code class="language-cpp">struct Style
{
 Color color,
 // ...
};
</code></pre>
<p>Anschließend könntest du feste Styles vordefinieren.</p>
<p>Irgendwie so (diese Initialisierung wird nicht von allen Compilern unterstützt, glaub ich):</p>
<pre><code class="language-cpp">class Button
{
public:
    static Style Standard = {Yellow, ....};
};

// ...

Button.SetStyle(Button::Standard);
</code></pre>
<p>Ansonsten musst du das noch etwas konkretisieren. Zumindest mir erschließt sich das Problem nicht so wirklich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1913572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1913572</guid><dc:creator><![CDATA[?????????]]></dc:creator><pubDate>Wed, 16 Jun 2010 20:47:07 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Wed, 16 Jun 2010 21:40:56 GMT]]></title><description><![CDATA[<p>Im Prinzip mache ich es genau so, nur dass meine struct eine class ist. Wenn ich jetzt etwas in der Button-Class ändere muss ich das auch in der ButtonStyle-Class tun. Evtl. auch in der ButtonBase-Class usw. Die einzelnen Variablen habe ich als protected deklariert. D.h. der Nutzer kann auf diese nur mit z.B. Set/GetBackgroundColor zugreifen. In den Funktionen wird dann noch geprüft, ob der Eingabewert gültig ist usw. Ändere ich jetzt eine Bedingung darf ich nicht vergessen das auch in der zugehörigen Style-Klasse zu machen. Aber geht wohl nicht anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1913589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1913589</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Wed, 16 Jun 2010 21:40:56 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Wed, 16 Jun 2010 21:47:37 GMT]]></title><description><![CDATA[<p>Warum hat Button denn eine setBackgroundColor Methode wenn es dafuer den ButtonStyle gibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1913591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1913591</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 16 Jun 2010 21:47:37 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Thu, 17 Jun 2010 08:40:00 GMT]]></title><description><![CDATA[<p>Wenn du es richtig machen willst, schau dir CSS an. Muss ja nicht gleich die komplette Bandbreite sein, die nutzt Qt ja auch nicht, ist aber sehr komfortabel. Vor allem für Neueinsteiger.</p>
<p>Nimmst eine Style-Klasse, diese bekommt einen Bezeichner der bestimmt für was dieser gilt. Zum Beispiel &quot;Button&quot; für alle Button oder &quot;Button#Horst&quot; für alle Button deren Name Horst ist usw. Dann berechne anhand dieser eine Priorität die du auch in der Klasse speicherst. Sortiere die Liste der geladenen Styles danach.<br />
Wird nun ein GUI-Object initialisiert gehst du die Liste der geladenen Style-Elemente durch und schaust welches für dieses Objekt gilt. Gehe dabei von niedriger Priorität bis zur höchsten, so überschreibst du auch eventuell nicht mehr relevante Werte mit jenen höherer Priorität.</p>
<p>Jedes Gui-Object hat dabei eine (abgeleitete) applyStyle-Funktion oder sowas, die sich die nötigen Informationen rausholt. Hierbei hilft es natürlich (und bei vielen anderen Dingen) wenn man abstrakte Überklassen hat, die die Gui-Elemente strukturieren in ihrer Hierarchie (AbstractButton zB für PushButtons, Checkboxes und RadioButtons etc.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1913707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1913707</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Thu, 17 Jun 2010 08:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Thu, 17 Jun 2010 19:33:26 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Warum hat Button denn eine setBackgroundColor Methode wenn es dafuer den ButtonStyle gibt?</p>
</blockquote>
<p>Es sollen ja auch mehrere Styles verwendet werden können, bzw. die einzelnen Eigenschaften des Button auch individuell angepasst werden können ohne dafür einen neuen Style entwerfen zu müssen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/17700">@Fellhuhn</a><br />
Ja oder eben X(A)ML anstatt CSS.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914096</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Thu, 17 Jun 2010 19:33:26 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Thu, 17 Jun 2010 19:38:07 GMT]]></title><description><![CDATA[<p>Student83 schrieb:</p>
<blockquote>
<p>Es sollen ja auch mehrere Styles verwendet werden können, bzw. die einzelnen Eigenschaften des Button auch individuell angepasst werden können ohne dafür einen neuen Style entwerfen zu müssen.</p>
</blockquote>
<p>Das beantwortet die Frage nicht. Denn das kannst du auch alles ueber die Style Klasse machen. Richtig flexibel ist es natuerlich wenn es einen computed-style gibt wie Fellhuhn beschreibt.</p>
<p>Aber der Punkt ist, dass du eine Style Klasse hast die sich um Styles kuemmert. Und eine Control Klasse die sich um das Control kuemmert. Dann hast du naemlich auf einen Schlag alle deine Probleme aus deinem ersten Post geloest.</p>
<p>Ein Button kann ja durchaus auch ein Style-Objekt als Member haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914101</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 17 Jun 2010 19:38:07 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Mon, 22 Nov 2010 19:51:12 GMT]]></title><description><![CDATA[<p>Wenn ich das also richtig verstanden habe soll ich jeder GUI-Element-Klasse ein Style-Member hinzufügen. Allerdings bräuchte ich dann ja so eine Art Super-Style der die Style-Eigenschaften aller Controls enthält. Damit würde aber, da die unterschiedlichen Styles im Umfang sehr unterschiedlich sind, bei den primitiveren GUI-Element-Klassen viele unnütze Variablen zur Verfügung gestellt und damit viel Speicher verschwendet. Oder habt ihr das anders gemeint?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984358</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Mon, 22 Nov 2010 19:51:12 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Tue, 23 Nov 2010 07:40:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Style
{
public:
  Color ButtonColor();
  Color TextColor();
  Font FontStyle();
  // ....
};

class Button
{
public:
  /*static ?*/void ChangeStyle(const Style&amp; s)
  {
    color_ = s.ButtonColor();
  }
private:
  /*static ?*/ Color color_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1984462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984462</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 23 Nov 2010 07:40:12 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Wed, 24 Nov 2010 13:25:45 GMT]]></title><description><![CDATA[<p>Ok, allerdings muss ich die Style-Variablen als private setzen (wegen Gültigkeitsprüfung), damit auf diese nur über Set/Get-Funktionen zugegriffen werden kann.<br />
Außerdem muss ich die ganzen Variablen so in der Button-Klasse und der Style-Klasse angeben. Wäre es nicht eleganter die Buttonklasse von der Style Klasse abzuleiten:</p>
<pre><code>class Button : public Style {...};
</code></pre>
<p>So hätte ich den Style komplett von der Buttonklasse getrennt. Allerdings kommt es dann ja zum Diamant-Ploblem.</p>
<p>Nehmen wir mal folgendes Beispiel:</p>
<pre><code>class Style {...};
class ControlStyle : public Style {...};
class ButtonStyle : public ControlStyle {...};
</code></pre>
<p>und</p>
<pre><code>class Control : public ControlStyle {...};
class Button : public Control, ButtonStyle {...};
</code></pre>
<p>Die Klasse Button bekommt nun den ControlStyle und den ButtonStyle vererbt, was so nicht sein soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985119</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Wed, 24 Nov 2010 13:25:45 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Wed, 24 Nov 2010 13:41:55 GMT]]></title><description><![CDATA[<p>Ich verstehe dein Problem nicht, aber Button von Style erben zu lassen ist absoluter Blödsinn. Button ist ein Fesnter oder ein Widget oder was auch immer, aber Button <strong>ist</strong> kein Style. Es <strong>hat</strong> einen Style oder <strong>benutzt</strong> einen Style um sich selber zu zeichnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985135</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 24 Nov 2010 13:41:55 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Wed, 24 Nov 2010 21:46:12 GMT]]></title><description><![CDATA[<p>Wenn ich den Style als public Member einer Steuerlement-Klasse deklariere kann ich z.B. so:</p>
<pre><code>m_pControl-&gt;Style-&gt;SetWidth(50);
</code></pre>
<p>darauf zugreifen.<br />
Ich muss allerdings den Style als private deklarieren da ja sonst der z.B. Control-Style an alle abgeleitete Klassen vererbt werden würde. Jetzt kann allerdings der Style auch nicht mehr von außen verändert werden. Folgendes geht also nicht mehr:</p>
<pre><code>Button *m_pButton;
m_pButton = new Button();
m_pButton-&gt;Style-&gt;SetWidth(60);
m_pButton-&gt;Style-&gt;SetHeight(20);
</code></pre>
<p>Also brauche ich für jede Steuerelement-Klasse nun auch noch Set/Get-Funktionen um jede Variable des Styles verändern zu können. Und genau diesen zusätzlichen Wülst an Funktionen möchte ich mir sparen. Darum möchte ich wissen ob es nicht ein besseres Konzept gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985400</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Wed, 24 Nov 2010 21:46:12 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Wed, 24 Nov 2010 22:22:56 GMT]]></title><description><![CDATA[<p>Student83 schrieb:</p>
<blockquote>
<p>Also brauche ich für jede Steuerelement-Klasse nun auch noch Set/Get-Funktionen um jede Variable des Styles verändern zu können. Und genau diesen zusätzlichen Wülst an Funktionen möchte ich mir sparen. Darum möchte ich wissen ob es nicht ein besseres Konzept gibt.</p>
</blockquote>
<p>Warum nicht ein Get/Set-Paar für den Style?</p>
<pre><code class="language-cpp">class Button
{
    public:
        Style GetStyle() const;
        void  SetStyle(const Style&amp; style);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1985413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985413</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Nov 2010 22:22:56 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Fri, 26 Nov 2010 13:29:16 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a><br />
Das wäre natürlich schonmal viel praktischer. Wie sieht das denn von der Ausführungdsgeschwindigkeit aus wenn ich z.B. nur die Breite eines Button zurückgegeben haben möchte und</p>
<pre><code>button-&gt;GetStyle()-&gt;GetWidth();
</code></pre>
<p>aufrufe. Wird durch diesen Aufruf wirklich nur die Breite zurückgegeben. Oder im erten Schritt sozusagen zunächst der ganze Style und im zweiten Schritt dann nur noch die Breite?</p>
<p>Und kann mir evtl. noch jemand erklären wie die Implementation von den Styles bei Qt gelöst ist?</p>
<p>Dort scheint der Style über einen Zeiger realisiert zu sein:</p>
<pre><code>public:
    QStyle *style() const;
    void setStyle(QStyle *);
</code></pre>
<p>Achso, und was bewirkt eigentlich &quot;() const&quot; hinter einer Variablen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986177</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Fri, 26 Nov 2010 13:29:16 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Fri, 26 Nov 2010 13:20:22 GMT]]></title><description><![CDATA[<p>Student83 schrieb:</p>
<blockquote>
<p>Achso, und was bewirkt eigentlich &quot;() const&quot; hinter einer Variablen?</p>
</blockquote>
<p>autsch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986187</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Fri, 26 Nov 2010 13:20:22 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Fri, 26 Nov 2010 13:42:26 GMT]]></title><description><![CDATA[<p>Autsch, wenn deine fast 1000 anderen Beiträge auch so aussehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    />. Erklären kannst du es offensichtlich nicht. Ich programmiere schon lange und das habe ich jetzt zum ersten mal bei Qt gesehen.<br />
Hab jetzt selbst die Erklärung gefunden:<br />
<a href="http://en.wikipedia.org/wiki/Const-correctness" rel="nofollow">http://en.wikipedia.org/wiki/Const-correctness</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986195</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Fri, 26 Nov 2010 13:42:26 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Fri, 26 Nov 2010 14:16:32 GMT]]></title><description><![CDATA[<p>sry, aber diese frage tat wirklich weh.</p>
<blockquote>
<p>Achso, und was bewirkt eigentlich &quot;() const&quot; hinter einer Variablen?</p>
</blockquote>
<p>'()' bewirkt, das es sich um eine memberfunktion handelt und nicht um eine variable. const hast du ja scheinbar inzwischen schon rausgefunden.</p>
<p>das autsch bezog sich nicht auf das const</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986223</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Fri, 26 Nov 2010 14:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Fri, 26 Nov 2010 17:40:28 GMT]]></title><description><![CDATA[<p>Student83 schrieb:</p>
<blockquote>
<p>Ich programmiere schon lange und das habe ich jetzt zum ersten mal bei Qt gesehen.</p>
</blockquote>
<p>Nicht böse gemeint, aber programmierst du auch schon lange C++? Sowohl <code>const</code> als auch Memberfunktionen sind etwas ziemlich Grundlegendes und vor allem auch etwas, das einem andauernd im C++-Alltag begegnet.</p>
<p>Wegen Performance: Du kannst ja Pass by Reference benutzen, wenn es angebracht ist. Ein bisschen kopieren musst du halt je nachdem immer noch. Aber wenn du den Benutzer nicht direkt das <code>Style</code> -Objekt innerhalb <code>Button</code> ändern lässt, muss er halt jeweils einen neuen <code>Style</code> erstellen und den setzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986347</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 26 Nov 2010 17:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to Styles in eigene Gui implementieren on Fri, 26 Nov 2010 21:41:12 GMT]]></title><description><![CDATA[<p>@ Meep Meep<br />
Jetzt sehe ich es auch, ich habe da wohl etwas überzogen reagiert. Das const hat mich so irritiert dass ich nicht erkannt habe, dass das ne Funktion und keine Varible ist. Da kann man wirklich nur autsch schreiben ;). Hätten die die Funktion &quot;getStyle&quot; genannt wäre das auch sofort klar gewesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986475</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Fri, 26 Nov 2010 21:41:12 GMT</pubDate></item></channel></rss>