Solved Qt Stylesheets
-
Hallo zusammen,
zu dieses Tutorial habe ich Frage:
http://thesmithfam.org/blog/2009/09/10/qt-stylesheets-tutorial
--> Step 3Wie 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?
-
@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?
- Auf dem Fenster (Top-Levle widget) musst du die
windowFlags
aufQt::CustomizeWindowHint | Qt::FramelessWindowHint
- und auch ein
widgetAttribute
aufQt::WA_TranslucentBackground
setzen - möglich dass man auch noch die Hintergrundfarbe auf
transparent
setzen muss (z.B. via CSS)
- Auf dem Fenster (Top-Levle widget) musst du die
-
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 -
@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. -
@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.
-
Ich dachte, dass ich das Fenster mit der Maus bewegen kann.
-
@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
-
@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
-
-
- Ohne das:
dialog->resize(dialog->sizeHint());
Dialog ist abgeschnitten.
- Mit:
dialog->resize(dialog->sizeHint());
wird nichts gezeigt
-
@Galilio
dann verwendest du kein Layout indialog
?Mein Vorschlag funktioniert nur wenn du ein Layout verwendest (oder
sizeHint()
überladen hast). Ohne Layout musst du den Dialog selbst resizen bis es passt. -
doch ich verwende einen Layout und zwar den Grid Layout.