[erledigt] GraphicsItem-Menü auf zweitem Bildschirm anzeigen

Alles rund um die Programmierung mit Qt
Antworten
q-tee
Beiträge: 32
Registriert: 17. September 2007 17:43

[erledigt] GraphicsItem-Menü auf zweitem Bildschirm anzeigen

Beitrag 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());
}
Dateianhänge
multihead-menu.zip
(8.83 KiB) 309-mal heruntergeladen
Zuletzt geändert von q-tee am 27. September 2007 14:58, insgesamt 2-mal geändert.
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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.
q-tee
Beiträge: 32
Registriert: 17. September 2007 17:43

Beitrag 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.
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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();
q-tee
Beiträge: 32
Registriert: 17. September 2007 17:43

Beitrag 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.
q-tee
Beiträge: 32
Registriert: 17. September 2007 17:43

Beitrag 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.
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag 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 :)
q-tee
Beiträge: 32
Registriert: 17. September 2007 17:43

Beitrag 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...
q-tee
Beiträge: 32
Registriert: 17. September 2007 17:43

Beitrag 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!
Dateianhänge
multihead-menu.zip
(9.21 KiB) 290-mal heruntergeladen
Antworten