Seite 1 von 1
qpixmap koordinaten geben und in widget positionieren
Verfasst: 19. Juli 2006 10:23
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
Verfasst: 19. Juli 2006 13:36
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
Verfasst: 19. Juli 2006 17:17
von michbex
kannst das childwidget ja mit
verschieben. x und y sind natuerlich relativ zum parent widget
Michael
Verfasst: 21. Juli 2006 11:15
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
paintEvent zu langsam
Verfasst: 24. Juli 2006 07:49
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
Verfasst: 24. Juli 2006 08:11
von upsala
du kannst doch nicht in jedem Paint-Event die Karte neu laden:
Verfasst: 24. Juli 2006 08:13
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?!
Verfasst: 24. Juli 2006 08:17
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.
Verfasst: 24. Juli 2006 08:22
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
Verfasst: 24. Juli 2006 08:30
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("...");
}
Verfasst: 24. Juli 2006 08:35
von Maik
geil....läuft sehr flüssig.
besten danke
signal/slot
Verfasst: 24. Juli 2006 10:47
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