Seite 1 von 1

[erledigt] GraphicsItem-Menü auf zweitem Bildschirm anzeigen

Verfasst: 27. September 2007 11:25
von q-tee
hey leute,

also ich habe zwei bildschirme (mit QDesktopWidget, kein Xinerama). mein problem ist, dass ein QGraphicItem, das auf dem zweiten bildschirm gezeigt wird, menüs immer auf dem ersten bildschirm erzeugt.

wie kann ich rausfinden, auf welchem bildschirm geklickt wurde und das menü dort entsprechend anzeigen?

beispiel-code gibts hier und im anhang:

main.cpp

Code: Alles auswählen

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QGraphicsScene *scene = new QGraphicsScene();
    MyGraphicsItem *rect = new MyGraphicsItem(0,0,50,50, "Test-Item");

    scene->addItem(rect);

    QDesktopWidget *desktop = new QDesktopWidget();

    // create window on every available screen
    for (int i = 0; i < desktop->numScreens(); i++)
    {
        QGraphicsView *screen = new QGraphicsView(scene, desktop->screen(i)); //forward 'screen(i)' as parent to see output on screen i
        screen->show();
    }
    return app.exec();
}
myitem.cpp

Code: Alles auswählen

MyGraphicsItem::MyGraphicsItem(float x, float y, float w, float h, QString label)
    : QGraphicsRectItem(x, y, w, h)
{
    this->label = label;
}

void MyGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    Q_UNUSED(event);

    QDesktopWidget *desk = new QDesktopWidget();

    QMenu *menu = new QMenu();

    menu->addAction("My Graphics Item Menu for " + label);
    menu->addAction("you clicked on screen " + QString::number(desk->screenNumber(QCursor::pos())));    // <-- das war mein versuch, der geht aber nich...
    menu->exec(QCursor::pos());
}

Verfasst: 27. September 2007 11:30
von CaptnChaos
Ich kannst leider nicht testen, aber mach mal SPasseshalber das QMenu zum Child von dem DesktopWidget auf dems Angezeigt werden soll.

Und guck dir ma QCursor::pos() an, ob x()/y() größer ist als die Size von einem Desktop. Dann wärs auch wieder leicht zu lösen.

Verfasst: 27. September 2007 11:37
von q-tee
da ich kein xinerama verwende (hab ich vergessen dazuzusagen) geht das mit der desktop-size nich...

Code: Alles auswählen

    QMenu *menu = new QMenu(desk);
bringt auch nichts. ich kann dummerweise ja nich auf das view-widget zugreifen, sondern nur auf das graphic-item, was kein QWidget ist - also auch keine bildschirm-nummer ausspuckt.

Verfasst: 27. September 2007 11:44
von CaptnChaos
aber du kannst seine scene und damit seinen GraphicsView rauskriegen, was wiederum ein widget ist und die ScreenNumber ausspuckt.

Code: Alles auswählen

QGraphicsView *view = item->scene()->views().last();

Verfasst: 27. September 2007 12:03
von q-tee
.last() gibt aber immer den "hintersten" monitor aus - also das letzte element in der QList views() und nicht den "zuletzbenutzten"... es wird also immer auf dem zweiten monitor angezeigt.

Verfasst: 27. September 2007 12:24
von q-tee
ich hätte ja noch die idee gehabt, das mouseEvent auf view-ebene abzufangen und dann mit itemAt() an das MyGraphicsItem weiterzugeben... das geht aber nich da die beiden unterschiedliche mouse-event-typen haben (QMouseEvent bei der view und QGraphicsSceneMouseEvent bei den items).
alles auf view-ebene zu verarbeiten geht aber auch nich, da ich ja zB hier auf das label-attribut meines items zugreifen will.

Verfasst: 27. September 2007 12:30
von C_R
Sehe ich das richtig, dass du ein und dasselbe MyGraphicsItem an beide Scenes übergibst? Vielleicht müsstest du einfach 2 Instanzen davon anlegen...

Aber habe mit dem Zeug noch nicht gearbeitet :)

Verfasst: 27. September 2007 12:36
von q-tee
das item ist einmal in der scene - auf beiden bildschirmen ist ein view, das darauf schaut. das soll auch nach möglichkeit so bleiben, da auf beiden bildschirmen die gleichen informationen aus einem anderen blickwinkel betrachtet werden.

-> verschieben auf bildschirm 1 soll auch das objekt auf bildschirm 2 verschieben...

Verfasst: 27. September 2007 14:47
von q-tee
ich habs geschafft! 8)

und hier ist der trick, für die nachwelt festgehalten:

Code: Alles auswählen

    QGraphicsView *view;

    foreach (view,  this->scene()->views())
    {
        if (view->underMouse() || view->hasFocus()) break;
    }

    QMenu *menu = new QMenu(view);
nochmal danke für die hilfe!