Qt Stylesheets



  • Hallo zusammen,

    zu dieses Tutorial habe ich Frage:
    http://thesmithfam.org/blog/2009/09/10/qt-stylesheets-tutorial
    --> Step 3

    Wie kann ich den View (nur Ovalform) von MyLoginForm.ui erstellen.
    Ich möchte keine rechteckform haben und in der mitte dieses Ovalform.

    Ist das machbar?

    danke



  • @Galilio Hi! Ich hab nicht verstanden. Was willst du machen?


  • Moderators

    @Galilio
    abgsehen davon dass ich auch nicht 100%ig vertsanden habe was die Frage genau ist, versuche ich es trotzdem :)

    Ich nehme an du willst quasi ein "rundes" Fenster haben? Nur das Oval als Fenster?

    1. Auf dem Fenster (Top-Levle widget) musst du die windowFlags auf Qt::CustomizeWindowHint | Qt::FramelessWindowHint
    2. und auch ein widgetAttribute auf Qt::WA_TranslucentBackground setzen
    3. möglich dass man auch noch die Hintergrundfarbe auf transparent setzen muss (z.B. via CSS)


  • Hi raven,

    danke es ist genau was ich brauche.

    Ich habe dein Vorschlag ausprobiert, aber es hat aucht nicht gebracht.
    Anbei einen Codeabschnitt:

    int main(int argc, char *argv[])
    {
    	Qt::CustomizeWindowHint | Qt::FramelessWindowHint;
    	Qt::WA_TranslucentBackground;
    	QApplication a(argc, argv);
    	MyApplication w;
    	w.show();
    	return a.exec();
    }
    

    Vielleicht verstehe ich das falsch :-(
    danke


  • Moderators

    @Galilio said in Qt Stylesheets:

    Vielleicht verstehe ich das falsch :-(

    ja ;)

    Die window flags musst du natürlich auf eine widget Instanz setzen.

    widget->setWindowFlags( Qt::CustomizeWindowHint | Qt::FramelessWindowHint );
    widget->setAttribute( Qt::WA_TranslucentBackground );
    


  • erste mal vielen vielen dank.
    Es funktioniert.
    Allerdings mit einen neben Effekt. Ich kann die Application nicht mehr mit der Maus bewegen.


  • Moderators

    @Galilio said in Qt Stylesheets:

    Ich kann die Application nicht mehr mit der Maus bewegen.

    ja klar.
    Wie hast du dir vorgestellt das Fenster zu bewegen?



  • Du kannst die mouse event handler überschreiben, um das Fenster wieder beweglich zu machen.



  • @raven-worx

    Ich dachte, dass ich das Fenster mit der Maus bewegen kann.


  • Moderators

    @Galilio
    ja, aber wie geanu?
    Da ja nun kein Fenster-Rahmen mehr da ist um das Fenster zu bewegen. Man kann es nun schon so implementieren, dass du das Fenster an einer beliebigen Position (auf dem Hintergrund) verschieben kannst:

    // in .h
    QPoint hotSpot;
    
    // in .cpp
    void MyWidget::mousePressEvent( QMouseEvent* event )
    {
         if( event->button() == Qt::LeftButton )
         {
                 hotSpot = this->mapFromGlobal(event->globalPos());
                 event->accept();
                 return;
         }
         BaseClass::mousePressEvent( event );
    }
    
    void MyWidget::mouseMoveEvent( QMouseEvent* event )
    {
          if( hotSpot.isValid() )
          {
                this->move( event->globalPos() + hotSpot );
                event->accept();
                return;
          }
          BaseClass::mouseMoveEvent( event );
    }
    
    void MyWidget::mouseReleaseEvent( QMouseEvent* event )
    {
         if( event->button() == Qt::LeftButton )
         {
                 hotSpot = QPoint();
                 event->accept();
                 return;
          }
         BaseClass::mousePressEvent( event );
    }
    


  • @raven-worx Hängt glaub ich auch vom Desktop-System ab: Unter KDE braucht man, um Fenster zu verschieben, ja nicht unbedingt mit der Maus an der window title bar herumzuziehen; da kann man auch Alt + <linke Maustaste gedrückt halten> direkt ins Fenster machen und dann verschieben.



  • @raven-worx said in Qt Stylesheets:

    // in .h
    QPoint hotSpot;

    // in .cpp
    void MyWidget::mousePressEvent( QMouseEvent* event )
    {
    if( event->button() == Qt::LeftButton )
    {
    hotSpot = this->mapFromGlobal(event->globalPos());
    event->accept();
    return;
    }
    BaseClass::mousePressEvent( event );
    }

    void MyWidget::mouseMoveEvent( QMouseEvent* event )
    {
    if( hotSpot.isValid() )
    {
    this->move( event->globalPos() + hotSpot );
    event->accept();
    return;
    }
    BaseClass::mouseMoveEvent( event );
    }

    void MyWidget::mouseReleaseEvent( QMouseEvent* event )
    {
    if( event->button() == Qt::LeftButton )
    {
    hotSpot = QPoint();
    event->accept();
    return;
    }
    BaseClass::mousePressEvent( event );
    }

    vielen dank
    Es ist genau was ich brauche:
    Hier meine kleine Ergänzung:

    // in .h
    QPoint hotSpot;
    
    // in .cpp
    void MyWidget::mousePressEvent( QMouseEvent* event )
    {
         if( event->button() == Qt::LeftButton )
         {
                 hotSpot = this->mapFromGlobal(event->globalPos());
                 event->accept();
                 return;
         }
    	if (event->button() == Qt::RightButton)
    	{
    		hotSpot = this->mapFromGlobal(event->globalPos());
    		event->accept();
    		return;
    	}
         BaseClass::mousePressEvent( event );
    }
    
    void MyWidget::mouseMoveEvent( QMouseEvent* event )
    {
        QPoint point = event->pos() - hotSpot;
    	if (point.manhattanLength()>0)
                this->move( event->globalPos() - hotSpot );
                event->accept();
                return;
          }
          BaseClass::mouseMoveEvent( event );
    }
    
    void MyWidget::mouseReleaseEvent( QMouseEvent* event )
    {
         if( event->button() == Qt::LeftButton )
         {
                 hotSpot = QPoint();
                 event->accept();
                 return;
          }
         BaseClass::mousePressEvent( event );
    }
    

    sonst funktioniert alles
    nochmal danke



  • Guten morgen Zusammen,

    eine Frage zu dem Thema.

    ich habe einen Dialog in MyApplication.
    In dieses Dialog möchte ich auch das gleiche Design wie MyApplication
    Dieses Dialog wird so gerufen:

    void MyApplication::showAboutApplication()
    {
    AboutDialog *dialog = new AboutDiaolog(this);
    dialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    dialog->setAttribute(Qt::WA_TranslucentBackground);
    dialog->exec();
    delete dialog;
    
    }
    

    Das komisch daran ist, dass das Dialog abgeschnitten wird.
    was ist daran falsch?

    danke in voraus


  • Moderators

    @Galilio
    ist ein Layout auf dem Dialog gesetzt? Wenn ja, dann:

    void MyApplication::showAboutApplication()
    {
    AboutDialog *dialog = new AboutDiaolog(this);
    dialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    dialog->setAttribute(Qt::WA_TranslucentBackground);
    dialog->resize( dialog->sizeHint() );  // <<<<<<<<<<<<
    dialog->exec();
    delete dialog;
    }
    


  • Hallo,

    es passiert nichts.



  • Mit passiert nichts meine ich: Dialog wird nicht mal gezeigt


  • Moderators

    @Galilio
    du hast geschrieben

    Das komisch daran ist, dass das Dialog abgeschnitten wird.

    ???



  • @raven-worx

    1. Ohne das:
    dialog->resize(dialog->sizeHint());
    

    Dialog ist abgeschnitten.

    1. Mit:
    dialog->resize(dialog->sizeHint());
    

    wird nichts gezeigt


  • Moderators

    @Galilio
    dann verwendest du kein Layout in dialog?

    Mein Vorschlag funktioniert nur wenn du ein Layout verwendest (oder sizeHint() überladen hast). Ohne Layout musst du den Dialog selbst resizen bis es passt.



  • @raven-worx

    doch ich verwende einen Layout und zwar den Grid Layout.


  • Moderators

    @Galilio
    was gibt folgendes zurück?

    qDebug() << dialog->layout();
    


  • @raven-worx

    QGridLayout(0x142624d8, name = "gridLayout_2")


  • Moderators

    @Galilio
    hmm...strange.
    Dann dürfte irgendein widget in der Hierachie nicht sizeHint() implementiert haben, oder eine maximum size gesetzt sein? ... kA
    Bleibt wohl nur das "händische resizen".



  • @raven-worx
    jetzt wenn ich das anwende:

    	AboutDialog *dialog = new AboutDialog(this);
    	dialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    	dialog->setAttribute(Qt::WA_TranslucentBackground);
    	dialog->resize(dialog->sizeHint());
    

    oder

    	AboutDialog *dialog = new AboutDialog(this);
    	dialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    	dialog->setAttribute(Qt::WA_TranslucentBackground);
    

    --> Dialog wird gar nicht gezeigt
    Ich setze auch nirgend eine Minimum bzw. Maximum


  • Moderators

    @Galilio said in Qt Stylesheets:

    dialog->resize(dialog->sizeHint());

    dialog->resize( QSize(x,y) ); //<< passende size
    


  • @raven-worx
    Dialog wird trotzdem nicht gezeigt


  • Moderators

    @Galilio
    also sobald dein Dialog resized wird, wird er nicht mehr gezeigt?!
    Dann ist irgendwas mit deiner Implementierung nicht in Ordnung.



  • @raven-worx
    Mit resize oder ohne
    Dialog wird nicht gezeigt.
    Wenn ich das ganze auskommentiere :

    	AboutDialog *dialog = new AboutDialog(this);
    	//dialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    	//dialog->setAttribute(Qt::WA_TranslucentBackground);
    	//dialog->resize(QSize(250,260));
    	qDebug() << dialog->layout();
    	dialog->exec();
    	delete dialog;
    

    --> Dialog wird gezeigt



  • @raven-worx
    Warum sollte in der Implementierung was falsch sein.
    Ich tue nicht anders als das Objeckt zu erzeugen mehr nicht.


  • Moderators

    @Galilio said in Qt Stylesheets:

    Mit resize oder ohne
    Dialog wird nicht gezeigt.
    Wenn ich das ganze auskommentiere :

    liegt ws nur an der Zeile mit Qt::WA_TranslucentBackground?? Kannst du das mal ausprobieren.

    Läuft irgendeine OpenGL Anwendung nebenbei?



  • @raven-worx said in Qt Stylesheets:

    liegt ws nur an der Zeile mit Qt::WA_TranslucentBackground??
    @ Was meinst du bitte damit?
    Läuft irgendeine OpenGL Anwendung nebenbei?
    @ Nein


  • Moderators

    @Galilio said in Qt Stylesheets:

    Was meinst du bitte damit?

    dass es ws nur an deiser einen Zeile liegt.



  • @raven-worx
    wenn ich so schreibe:

    	AboutDialog *dialog = new AboutDialog(this);
    	//dialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    	dialog->setAttribute(Qt::WA_TranslucentBackground);
    	//dialog->resize(QSize(250,260));
    	qDebug() << dialog->layout();
    	dialog->exec();
    	delete dialog;
    

    --> Dialog wird gezeigt
    und wenn ich so schreibe:

    	AboutDialog *dialog = new AboutDialog(this);
    	dialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    	//dialog->setAttribute(Qt::WA_TranslucentBackground);
    	//dialog->resize(QSize(250,260));
    	qDebug() << dialog->layout();
    	dialog->exec();
    	delete dialog;
    

    --> Dialog wird nicht gezeigt


  • Moderators

    @Galilio
    ok, dann versuch mal das:

    dialog->setWindowFlags( Qt::Dialog | Qt::FramelessWindowHint | Qt::CustomizeWindowHint );
    


  • @raven-worx said in Qt Stylesheets:

    dialog->setWindowFlags( Qt::Dialog | Qt::FramelessWindowHint | Qt::CustomizeWindowHint );

    Hi,

    1000000000 dank
    So funktioniert wie es sein muss:

    	dialog->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::CustomizeWindowHint);
    	dialog->setAttribute(Qt::WA_TranslucentBackground);
    

    Danke noch mal :-)



  • @raven-worx

    Sorry
    ich habe es noch eine Frage:
    Es geht eigentlich um das gleiche Thematik:
    Die Application und der Dialog sind gleich designed.
    Damit die GUI mittels Maus bewegt werden können müssen folgende Fkt überschrieben werden:
    void mousePressEvent(QMouseEvent* event);
    void mouseMoveEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);

    Meine Frage: da es sich dieses Fkt bei der App "class" so wie bei der Dialog "class" gleich implementiert sind, gibt es eine möglichkeit diese doppelt code zu verhindern in dem es nur einmal implementiert werden?


  • Moderators

    @Galilio said in Qt Stylesheets:

    Meine Frage: da es sich dieses Fkt bei der App "class" so wie bei der Dialog "class" gleich implementiert sind, gibt es eine möglichkeit diese doppelt code zu verhindern in dem es nur einmal implementiert werden?

    Wenn es möglich ist, dass beide eine gemeinsame Basis-Klasse haben, dann ja.
    Ansonsten könntest du preprocessor macros verwenden.



  • @raven-worx said in Qt Stylesheets:

    preprocessor macros

    und wie kann ich den preprocessor in diesem Zusammenhang anwenden ?
    :-(


  • Moderators

    @Galilio

    #define MOUSE_PRESS_CODE if( event->button() == Qt::LeftButton )\
         {\
                 hotSpot = this->mapFromGlobal(event->globalPos());\
                 event->accept();\
                 return;\
         }
    ...
    void MyWidget::mousePressEvent( QMouseEvent* event )
    {
         MOUSE_PRESS_CODE
         BaseClass::mousePressEvent( event );
    }
    

    für mehr infos => google


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.