qpixmap koordinaten geben und in widget positionieren
qpixmap koordinaten geben und in widget positionieren
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
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
Moin,
was hältst du von
Gruß,
Flachkoepper
was hältst du von
wenn du jetzt deine Landkarte als Child vom Widget erstellst, müsste das klappen.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.
Gruß,
Flachkoepper
kannst das childwidget ja mit
verschieben. x und y sind natuerlich relativ zum parent widget
Michael
Code: Alles auswählen
childwidget->move(x,y);Michael
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
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
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
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
du kannst doch nicht in jedem Paint-Event die Karte neu laden:
Code: Alles auswählen
QPixmap Karte("/home/bachmann/img/map/munchen.png"); 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?!
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?!
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("...");
}signal/slot
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
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