qpixmap koordinaten geben und in widget positionieren

Alles rund um die Programmierung mit Qt
Antworten
Maik
Beiträge: 45
Registriert: 29. Mai 2006 10:54

qpixmap koordinaten geben und in widget positionieren

Beitrag von Maik »

hi,

ich habe eine große landkarte(7000x4800). diese möchte ich in einem widget anzeigen.
wenn dich das widget(500x400) öffne soll der mittelpunkt der karte mit dem mittelpunkt des widget übereinstimmen. des weiteren soll ich die karte durch drücken von pushbuttons verschieben und zoomen können.

danke für eure hilfe

mfg
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Moin,

was hältst du von
QPoint QWidget::mapTo ( QWidget * parent, const QPoint & pos ) const
Translates the widget coordinate pos to the coordinate system of parent. The parent must not be 0 and must be a parent of the calling widget.
wenn du jetzt deine Landkarte als Child vom Widget erstellst, müsste das klappen.

Gruß,
Flachkoepper
michbex
Beiträge: 23
Registriert: 31. Mai 2006 15:53
Wohnort: Princeton
Kontaktdaten:

Beitrag von michbex »

kannst das childwidget ja mit

Code: Alles auswählen

childwidget->move(x,y);
verschieben. x und y sind natuerlich relativ zum parent widget


Michael
Maik
Beiträge: 45
Registriert: 29. Mai 2006 10:54

Beitrag von Maik »

hallo,

danke für eure tips. aber das ist nicht was ich suche.

mit move platziere ich ja nur das widget in meinem hauptfenster.
möchte aber, wenn ich das widget im hauptfenster öffne, den mittleren kartenausschnitt in dem widget sehen. ich kann es zwar mit

pixmap->setGeometry(int,int,int,int) so zurechtrücken das es passt. aber das ist ja nicht der sinn.

und ein anderes problem. das bild ist so groß das es probleme beim laden und anzeigen sowie zoomen und verschieben gibt.
gibts ne möglichkeit das zu verhindern?

danke

gruß maik
Maik
Beiträge: 45
Registriert: 29. Mai 2006 10:54

paintEvent zu langsam

Beitrag von Maik »

hi, habe zum test mal ein kleines programm geschrieben. hier der code für paintEvent:

void Widget_Display::paintEvent(QPaintEvent *)
{
links++;
static QPoint mapCentre = QPoint(-3905, -2670);
mapCentre.setX(mapCentre.x()+links);

QPixmap Karte("/home/bachmann/img/map/munchen.png");

QPainter map(this);
map.translate(250,200);
map.save();
map.drawPixmap(mapCentre, Karte);
map.restore();
map.setBrush(QColor(0,255,0));
map.drawEllipse(0,0,10,10);
}
connect(timer, SIGNAL(timeout()), this, SLOT(repaint()));

so, das problem ist jetzt das das repaint bzw. auch update zu lange brauch da meine karte zu groß ist. gibt es da möglichkeiten in qt das problem aus der welt zu schaffen?

danke

gruß maik
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

du kannst doch nicht in jedem Paint-Event die Karte neu laden:

Code: Alles auswählen

QPixmap Karte("/home/bachmann/img/map/munchen.png"); 
Maik
Beiträge: 45
Registriert: 29. Mai 2006 10:54

Beitrag von Maik »

hast recht...habe ich grad gesehn.

mache es jetzt so. aber schneller als vorher ist es auch nicht.

void Widget_Display::paintEvent(QPaintEvent *)
{
links++;
static QPoint mapCentre = QPoint(-3905, -2670);
mapCentre.setX(mapCentre.x()+links);

QPixmap Karte;
if (!QPixmapCache::find("Karte", Karte)) {
Karte.load("/home/bachmann/img/map/munchen.png");
QPixmapCache::insert("Karte", Karte);
}

QPainter map(this);
map.translate(250,200);
map.save();
map.drawPixmap(mapCentre, Karte);
map.restore();
map.setBrush(QColor(0,255,0));
map.drawEllipse(0,0,10,10);
}

das sollte doch eigentlich schneller sein oder?!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Laut Doku speichert QPixmapCache max. 1MByte. Deine Grafik hat aber ca. 5MByte, somit müßte deine Grafik immer noch jedes mal neu geladen werden.
Maik
Beiträge: 45
Registriert: 29. Mai 2006 10:54

Beitrag von Maik »

ja, aber auch wenn ich

QPixmapCache::setCacheLimit(4000);

benutze ändert sich nichts. die map ist 3,3 mb groß. das tiff-bild knapp 5 mb.
was kann man noch machen?

danke

gruß maik
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dein Cache ist immer noch zu klein, nach meiner Rechnung müßte der Cache 5MByte betragen. Oder du machst es so:

Code: Alles auswählen

static QPixmap Karte;
if (Karte.isNull()) {
  Karte.load("...");
}
Maik
Beiträge: 45
Registriert: 29. Mai 2006 10:54

Beitrag von Maik »

geil....läuft sehr flüssig.

besten danke
Maik
Beiträge: 45
Registriert: 29. Mai 2006 10:54

signal/slot

Beitrag von Maik »

so, jetzt habe ich ein anderes problem. wie stelle ich zwischen pushbutton und dem widget (map) konntakt her?

das geht nicht:
//Widget_Karte.h
class map;
//Widget_Karte.cpp
Karte = new map(this);
Karte->move(220, 100);
Karte->setVisible(true);

connect(Button_Left,SIGNAL(clicked()),this,SLOT(left()));

void Widget_Karte::left()
{
emit updateKarte(1);
}
//Map.cpp
void map::updateKarte(int position)
{
if(position==1) test=test+10; //signal kommt gar nicht hier an :-(
}

es fehlt glaube sowas in der art wie:

connect(this,SIGNAL(updateKarte( int )),????,SLOT(updateKarte(int)));

was muss ich aber an stelle der fragezeichen eintragen? map geht nicht?!

maik
Antworten