Hilfe bei einer Funktion // Zeichnen [gelöst]
Hilfe bei einer Funktion // Zeichnen [gelöst]
Morgen zusammen,
ich hätte mal eine bescheidene Frage. Wie müsste eine Funktion aussehn die wenn ich auf einen Button drücke mir etwas in ein QWidget zeichnet. z.B. eine Linie oder so.
Widget ist vorhanden... also wenns gehen würde such ich den aufbau einer Funktion die mir eine Linie in ein schon vorhandenes Widget auf Knopf druck zeichnet.
Label->setText("Text"); <--- Sowas wie das in der art.
Ja das ists eigentlich.
Danke schonmal.
ich hätte mal eine bescheidene Frage. Wie müsste eine Funktion aussehn die wenn ich auf einen Button drücke mir etwas in ein QWidget zeichnet. z.B. eine Linie oder so.
Widget ist vorhanden... also wenns gehen würde such ich den aufbau einer Funktion die mir eine Linie in ein schon vorhandenes Widget auf Knopf druck zeichnet.
Label->setText("Text"); <--- Sowas wie das in der art.
Ja das ists eigentlich.
Danke schonmal.
Zuletzt geändert von Qt-nator am 5. Februar 2008 09:14, insgesamt 1-mal geändert.
Zum einen wurdest du schon mal auf die Beispiele der Qt-Doku verwiesen. Zum anderen hast du schon mehrere Threads zu diesem Thema begonnen (z.B. diesen hier) aber keine Antworten mehr gegeben.
Dieses Beispiel zeigt eigentlich recht schön, wie man mit Qt zeichnen kann.
Dieses Beispiel zeigt eigentlich recht schön, wie man mit Qt zeichnen kann.
die Doku hab ich mir angesehn... und versucht das Beispiel nachzuarbeiten mit nicht allzugroßem Erfolg.
Jedenfalls hab ich jetzt was versucht. Und würde meine RenderArea.cpp und RenderArea.h zeigen und gerne wissen ob das dann so gehn würd? Also Erstellen läst es sich. (großer erfolg)
Nur mein problem ist jetzt das ich nicht weis wie ich es hinkriegen würde das man dann per Knopfdruck was in ein Widget zeichnet.
.... hier der Code.
RenderArea.cpp
RenderArea.h
Im Prinzip will ich ja einfach nur das man wenn man auf einen Knopf drückt was in ein Widget gezeichnet kriegt... damit könnte ich dann schon gut weiter arbeiten.
Danke schonmal.
Jedenfalls hab ich jetzt was versucht. Und würde meine RenderArea.cpp und RenderArea.h zeigen und gerne wissen ob das dann so gehn würd? Also Erstellen läst es sich. (großer erfolg)
Nur mein problem ist jetzt das ich nicht weis wie ich es hinkriegen würde das man dann per Knopfdruck was in ein Widget zeichnet.
.... hier der Code.
RenderArea.cpp
Code: Alles auswählen
#include <QtGui>
#include "renderarea.h"
#include "MainWindow.h"
RenderArea::RenderArea(QWidget *parent)
: QWidget(parent)
{
setBackgroundRole(QPalette::Base);
setAutoFillBackground(true);
}
void RenderArea::paintEvent(QPaintEvent * )
{
QPainter paint( this );
paint.drawLine(0, 0, 1000, 1000);
}
Code: Alles auswählen
#ifndef RENDERAREA_H
#define RENDERAREA_H
#include <QBrush>
#include <QPen>
#include <QPixmap>
#include <QWidget>
class RenderArea : public QWidget
{
Q_OBJECT
public:
enum Shape { Line, Points, Polyline, Polygon, Rect, RoundRect, Ellipse, Arc,
Chord, Pie, Path, Text, Pixmap };
RenderArea(QWidget *parent = 0);
void paintEvent(QPaintEvent *event);
private:
Shape shape;
};
#endif
Danke schonmal.
Ja das Basic Drawing Example hab ich jetzt hingekriegt... das werd ich jetzt auf meine Bedürfnisse zurecht schneidern.
das stand ja auch in der Doku. Also der zeichnet man speichert das zwischen und das ist dann was man sich anzeigen läst?
seh ich das richtig? (oder hab ich komplett falsch gedacht?)
und danke für die antwort
das stand ja auch in der Doku. Also der zeichnet man speichert das zwischen und das ist dann was man sich anzeigen läst?
seh ich das richtig? (oder hab ich komplett falsch gedacht?)
und danke für die antwort
das doch schonmal super das ichs verstanden hab.
Also was ich machen möchte ist ein Textfeld in das man reinschreibt und wenn man einen Butten drückt das sich dann in dem Widget das geschriebene zeichnet.
So aber nicht als text sondern der Text den ich in das Textfeld schreibe soll dem Widget dann als code dienen.
Quasi das ich reinschreiben kann:
Line 0 , 0 , 10 , 10 <--- sowas in der art
und das das Widget dann einen Linie Zeichnet.
Hoffe ich habs gut erklärt.
So was ich bis jetzt habe ist
Ein Widget was zeichnen kann. (Das aus dem Beispiel).
Eine shapeComboBox wo Polygon drin steht. (auch aus dem Beispiel)!
Da wäre z.B. wieder ein Problem an dem ich grad steh, aber das ergibt sich ja aus dem ganzen.
Ein Textfeld was einen standart inhalt besitzt. (Da soll man dann den code reinschreiben können)
2 Buttons. 1ter zum Zeichnen "Draw Button" der ist mit dem Widget connectet und führt dann die Funktion aus dem beispiel aus.
und der 2te Clear zum Text im Textfeld löschen.
Und des mit dem Antialasing hab ich drin gelassen.
Gedacht hab ich mir das wenn man den code in das Textfeld schreibt und auf den "Draw Button" klickt das man dann das zeichnet was man im code geschrieben hat.
Also ich versuche für den anfang eine Linie hinzukriegen.
Ja das eigentlich...
Edit: Achja das hab ich alles ohne den Designer gemacht
Also was ich machen möchte ist ein Textfeld in das man reinschreibt und wenn man einen Butten drückt das sich dann in dem Widget das geschriebene zeichnet.
So aber nicht als text sondern der Text den ich in das Textfeld schreibe soll dem Widget dann als code dienen.
Quasi das ich reinschreiben kann:
Line 0 , 0 , 10 , 10 <--- sowas in der art
und das das Widget dann einen Linie Zeichnet.
Hoffe ich habs gut erklärt.
So was ich bis jetzt habe ist
Ein Widget was zeichnen kann. (Das aus dem Beispiel).
Eine shapeComboBox wo Polygon drin steht. (auch aus dem Beispiel)!
Da wäre z.B. wieder ein Problem an dem ich grad steh, aber das ergibt sich ja aus dem ganzen.
Ein Textfeld was einen standart inhalt besitzt. (Da soll man dann den code reinschreiben können)
2 Buttons. 1ter zum Zeichnen "Draw Button" der ist mit dem Widget connectet und führt dann die Funktion aus dem beispiel aus.
Code: Alles auswählen
void Window::DrawChangedButton()
{
RenderArea::Shape shape = RenderArea::Shape(shapeComboBox->itemData(
shapeComboBox->currentIndex(), IdRole).toInt());
renderArea->setShape(shape);
}
Und des mit dem Antialasing hab ich drin gelassen.
Gedacht hab ich mir das wenn man den code in das Textfeld schreibt und auf den "Draw Button" klickt das man dann das zeichnet was man im code geschrieben hat.
Also ich versuche für den anfang eine Linie hinzukriegen.
Ja das eigentlich...
Edit: Achja das hab ich alles ohne den Designer gemacht
Dein Problem ist eher nicht die QT, sondern biss das verstaendniss von paar grundlegenden Systematischen dingen.
Aber jeder faengt mal an. Empfehlen wuerd ich daher eher Lektuere die sich mit paar einfachen programmiertechnischen dingen befasst, aber bissi ausfuehrlicher mit dem Drumherum ums programmieren befasst.
Die QT Doku und examples etc, werden dir da nur bedingt weiterhelfen, die meisten setzen schon umfangreichere kentnisse vorraus.
Zu deinem Speziellen Thema:
Beim "normalen" programmieren ist deine funktionalitaet schon statisch, d.h. du compilierst dein programm, und das fuehrt es dann entsprechend aus.
du kannst also nach dem start deines progs das binary, also das programm nimmer selber aendern.
was du willst, ist aber dynamisch.
Möglich ist sowas, aber es ist alles andere als trivial ....
2 grundlgende möglichkeiten ....
1. du parst deine eingabe, und entsprechend deiner "befehle" fuehrst du funktionen aus. Dazu brauchst du einen laufzeitparser, einen interpreter sozusagen. Die QT selber wird compiliert, der compiler ist also ungeeignet dafuer.
Entweder nutzt du fertige bibs / Loesungen - also nutzt dan auch die "Sprache" der Loesung, oder du implementierst ne eigene sprache, und parst dann selber. Fuer den parsevorgang gibts auch hilfestellung in form von tokenizern ...
Trolltech bietet fuer sowas Ihr QSA (QT Script for applications) an, da hab ich aber selber noch nix gemacht, mit.
2. Du lagerst deine zeichenfunktion in ne dll aus. die dll ziehst dynamisch nur beim zeichnen an.
weiterhin schreibst du dir funktionalitaet, wo du in die zeichenroutine deiner dll den code aus deinem widget irgendwie reinsetzen kannst.
wenn das ist, startest du von deinem program aus den compiler und compilierst die dll neu .... die dll darf dabei natuerlich nicht angezogen sein. dannach kannst wieder anziehen und die neue dll sollte jetzt das malen was du im widget beschrieben hasst. ... oder eben fehler bringen
wie gesagt das ist alles andere als trivial, ne ziemliche rumkonfiguriererei und ziemlich komplex was das fehlerabfangen anbetrifft.
damit wuerde auch nen "Profi" ne weile zu tun haben ...
Andere Bibs die dich da unterstuetzen ... keine ahnung, vielleicht weiss ein anderer was.
C++ ist halt ne compilierte Sprache (dafuer aber flott)
Ciao ...
Aber jeder faengt mal an. Empfehlen wuerd ich daher eher Lektuere die sich mit paar einfachen programmiertechnischen dingen befasst, aber bissi ausfuehrlicher mit dem Drumherum ums programmieren befasst.
Die QT Doku und examples etc, werden dir da nur bedingt weiterhelfen, die meisten setzen schon umfangreichere kentnisse vorraus.
Zu deinem Speziellen Thema:
Beim "normalen" programmieren ist deine funktionalitaet schon statisch, d.h. du compilierst dein programm, und das fuehrt es dann entsprechend aus.
du kannst also nach dem start deines progs das binary, also das programm nimmer selber aendern.
was du willst, ist aber dynamisch.
Möglich ist sowas, aber es ist alles andere als trivial ....
2 grundlgende möglichkeiten ....
1. du parst deine eingabe, und entsprechend deiner "befehle" fuehrst du funktionen aus. Dazu brauchst du einen laufzeitparser, einen interpreter sozusagen. Die QT selber wird compiliert, der compiler ist also ungeeignet dafuer.
Entweder nutzt du fertige bibs / Loesungen - also nutzt dan auch die "Sprache" der Loesung, oder du implementierst ne eigene sprache, und parst dann selber. Fuer den parsevorgang gibts auch hilfestellung in form von tokenizern ...
Trolltech bietet fuer sowas Ihr QSA (QT Script for applications) an, da hab ich aber selber noch nix gemacht, mit.
2. Du lagerst deine zeichenfunktion in ne dll aus. die dll ziehst dynamisch nur beim zeichnen an.
weiterhin schreibst du dir funktionalitaet, wo du in die zeichenroutine deiner dll den code aus deinem widget irgendwie reinsetzen kannst.
wenn das ist, startest du von deinem program aus den compiler und compilierst die dll neu .... die dll darf dabei natuerlich nicht angezogen sein. dannach kannst wieder anziehen und die neue dll sollte jetzt das malen was du im widget beschrieben hasst. ... oder eben fehler bringen
wie gesagt das ist alles andere als trivial, ne ziemliche rumkonfiguriererei und ziemlich komplex was das fehlerabfangen anbetrifft.
damit wuerde auch nen "Profi" ne weile zu tun haben ...
Andere Bibs die dich da unterstuetzen ... keine ahnung, vielleicht weiss ein anderer was.
C++ ist halt ne compilierte Sprache (dafuer aber flott)
Ciao ...
Zuletzt geändert von RHBaum am 14. Januar 2008 16:05, insgesamt 1-mal geändert.
Ja, jeder faengt halt man an, iss weiter ned schlimm ...
Noch was zu deinem Thema:
Fertige "Rendering Machines" gibts natuerlich, nur basiert keine davon auf C++ befehlssaetzen.
Weiss ned wie und was genau du zeichnes willst, und warum es unbedingt dynamisch sein muss.
Wenn nur zur "übung" ist hasst dir grad wieder ungeeignetes, gehasstes thema rausgesucht. Gehasst, weil, klingt alles easy, die umsetzung ist aber alles andere als einfach. Fuer sowas zahlen kunden dann auch ned gern
VIelleicht hilft es dir ja, ne vorhandene Rendering machine zu missbrauchen.
Ziemlich einfach zu implementieren waer:
Du leasst deine Grafik im SVG format in ein Textbrowser fenster eingeben, und auf der anderen seite laesst nen SVG widget die eingabe aus dem fenster "zeichnen".
Sollte unter QT ziemlich simpel sein, glaub das knackigste dran ist die fehlermeldungen vom renderer abzufangen, weil da wird nicht immer auf anhieb alles "valid" drinnestehen.
fuer SVG und wie es benutzt wird, gibts im INet doku's
Andere formate fuer Vectorgrafiken gibts auch, nur eben an die spezifikationen und den renderer rankommen
SVG bietet sich bei der QT da gradezu an ...
Ciao ....
Noch was zu deinem Thema:
Fertige "Rendering Machines" gibts natuerlich, nur basiert keine davon auf C++ befehlssaetzen.
Weiss ned wie und was genau du zeichnes willst, und warum es unbedingt dynamisch sein muss.
Wenn nur zur "übung" ist hasst dir grad wieder ungeeignetes, gehasstes thema rausgesucht. Gehasst, weil, klingt alles easy, die umsetzung ist aber alles andere als einfach. Fuer sowas zahlen kunden dann auch ned gern
VIelleicht hilft es dir ja, ne vorhandene Rendering machine zu missbrauchen.
Ziemlich einfach zu implementieren waer:
Du leasst deine Grafik im SVG format in ein Textbrowser fenster eingeben, und auf der anderen seite laesst nen SVG widget die eingabe aus dem fenster "zeichnen".
Sollte unter QT ziemlich simpel sein, glaub das knackigste dran ist die fehlermeldungen vom renderer abzufangen, weil da wird nicht immer auf anhieb alles "valid" drinnestehen.
fuer SVG und wie es benutzt wird, gibts im INet doku's
Andere formate fuer Vectorgrafiken gibts auch, nur eben an die spezifikationen und den renderer rankommen
SVG bietet sich bei der QT da gradezu an ...
Ciao ....
Morgen,
so hab jetzt einen neuen plan. Und zwar der gesamte inhalt von dem Textedit wird in einem QString gespeichert, der wird dann ausgelsen. und jeh nach dem wie der anfängt //(Text.startsWith("Text"))// wird dann geswitcht.
also Bei drawText... drawLine ... drawPolygon... so und mein Problem bei der sache ist jetzt wie ich jetzt in dem QString nach zahlen suchen kann (double am besten) und ab da dann bis zum nächsten komma springe und mir das dann rausschneide.
z.B.
drawLine(10,10,100,100); //Ich weis das Line ist und suche eine zahl also geh ich bis zur 1 dann geh ich soweit bis zum ersten komma also hab ich dann die 10 die will ich dann getrent abspeichern.
Das will ich dann so oft durchgehn bis ich eine spezielle endung habe z.B. 2mal leer.
Wäre das umsetzbar????
und wie kann ich die das mit dem suchen und raussschneiden bei QString bewerkstelligen?
so hab jetzt einen neuen plan. Und zwar der gesamte inhalt von dem Textedit wird in einem QString gespeichert, der wird dann ausgelsen. und jeh nach dem wie der anfängt //(Text.startsWith("Text"))// wird dann geswitcht.
also Bei drawText... drawLine ... drawPolygon... so und mein Problem bei der sache ist jetzt wie ich jetzt in dem QString nach zahlen suchen kann (double am besten) und ab da dann bis zum nächsten komma springe und mir das dann rausschneide.
z.B.
drawLine(10,10,100,100); //Ich weis das Line ist und suche eine zahl also geh ich bis zur 1 dann geh ich soweit bis zum ersten komma also hab ich dann die 10 die will ich dann getrent abspeichern.
Das will ich dann so oft durchgehn bis ich eine spezielle endung habe z.B. 2mal leer.
Wäre das umsetzbar????
und wie kann ich die das mit dem suchen und raussschneiden bei QString bewerkstelligen?