Tuesday, January 29. 2008Ab nach Granada! Morgen fahre ich mit Indra nach Granada! Julia kommt leider nicht mit. Sie hat ihre große Klausur schon am Montag, ich hab ja noch ein paar Tage mehr Zeit um auf die Historia Contemporánea del Mundo Hispánico (die letzten 200 Jahre Spaniens) zu lernen.Hier bin ich am Donnerstag Morgen ![]() Alhambra Mal sehen, was wir sonst noch so machen können dort. Natürlich steht die Kathedrale und Altstadt und das Viertel Albaycín auf dem Programm. Will gerne in einer typischen Tetería Tee trinken, und in die granadischen Tapas-Bars gehen (dort bekommt man die Tapas umsonst zum Getränk dazu!). Außerdem würden mich die arabischen Bädern mit Massage interessieren Monday, January 28. 2008So Touri wie noch nie!![]() Letztendlich sind wir nicht zum Strand gefahren, weil es ja einfach schon so genug in Sevilla zu sehen gibt und man schon 2 Tage braucht, bis man hier die schönsten Sehenswürdigkeiten und die schlangenähnlichen Altstadt-Shoppingstraßen im Zentrum gewürdigt hat Was übrigens auch erwähnenswert ist: unsere bis tief in die Nacht gehenden Abendessen! Ok, man fängt ja in Spanien auch erst später an, aber irgendwie ist das so spät auch viel gemütlicher! Sunday, January 27. 2008Mit Nina in Reales AlcázaresFriday, January 25. 2008Sommer im Winter! In den letzten 2 Wochen habe ich versucht, den Frühsommer nicht ganz an mir vorbei gehen zu lassen, während ich auf die Klausuren lerne. Das gelingt mir auch ganz gut, muss ich sagen Jedenfalls habe ich gestern die erste Klausur geschrieben. Für Sociolingüística Andaluza hab ich allerdings nicht ganz sooo viel gelernt gehabt, weil mir einfach die Motivation gefehlt hat: hab den Kurs ja nur zum Spaß besucht und brauche keine Credits davon! Bin aber echt froh, dass ich mitgeschrieben hab, weil es eine absolut einfache Klausur war! Also die hab ich auf jeden Fall in der Tasche! Da die nächste Klausur erst am 08.02. ansteht, und ich schon Mitte Januar angefangen hab dafür zu lernen, hab ich jetzt viel Freizeit! Was macht man bloß in Südspanien, wenn die Sonne scheint?? Genau, man fährt rum und guckt sich mehr von Andalucía an! Am Mittwoch fahre ich mit Indra und Julia nach Granada, Hostel und Tickets für die Alhambra hab ich eben online schon gebucht! Ich freu mich riesig!!! Ach ja, es handelt sich nur noch um Minuten bis meine Freundin Nina gleich ankommt! Wir werden uns ein schönes Wochenende machen und sogar zum Strand gehen! Monday, January 21. 2008more UI feedback![]() After a month of no KDE coding I'm back to do a few things in KDE again - though I really want to (and need to) do more for University if I ever want to get done with it... Anyway, what I wanted to show is how to do simple animations in the UI that should help the user to understand how the different UI elements play together. I have one such case with the Phonon KCM where I now tried the following animation to clear things up a bit: The way I achieved this effect was to add a special Animation widget that sits above the other widgets and is not added to any QLayout. Reimplement the paintEvent to draw the animation frames and use a QTimeLine member to call repaint(). It needs two pixmaps: one of the old content of the QListView at the right and one with the new content. The paintEvent then draws the old content over the QListView so that it seems the widget contents have not changed yet and draws the new content depending on the frame number of QTimeLine (with 50% opacity). QTimeLine::finished() is connected to the deleteLater slot which removes the animation widget. Here's the code: class SelectionChangeAnimation : public QWidget
{ public: SelectionChangeAnimation(const QRect &sourceRect, QWidget *destWidget, QWidget *parent); void start(); protected: void paintEvent(QPaintEvent *); bool eventFilter(QObject *, QEvent *); private: QTimeLine m_timeLine; QPixmap m_old, m_new; QRect m_sourceRect; QRect m_destRect; QWidget *m_destWidget; bool m_needPixmapUpdate; }; SelectionChangeAnimation::SelectionChangeAnimation(const QRect &sourceRect, QWidget *destWidget, QWidget *parent) : QWidget(parent), m_timeLine(200), m_sourceRect(sourceRect), m_destRect(destWidget->mapTo(parent, QPoint(0, 0)), destWidget->size()), m_destWidget(destWidget), m_needPixmapUpdate(true) { setGeometry(m_sourceRect | m_destRect); m_sourceRect.moveTopLeft(mapFrom(parent, m_sourceRect.topLeft())); m_destRect.moveTopLeft(mapFrom(parent, m_destRect.topLeft())); m_old = QPixmap::grabWidget(m_destWidget); m_timeLine.setFrameRange(0, 63); connect(&m_timeLine, SIGNAL(finished()), SLOT(deleteLater())); m_destWidget->installEventFilter(this); show(); } void SelectionChangeAnimation::start() { m_timeLine.start(); connect(&m_timeLine, SIGNAL(frameChanged(int)), SLOT(repaint())); } bool SelectionChangeAnimation::eventFilter(QObject *o, QEvent *e) { if (o == m_destWidget && e->type() == QEvent::Paint) { m_needPixmapUpdate = true; } return QWidget::eventFilter(o, e); } void SelectionChangeAnimation::paintEvent(QPaintEvent *) { const int f = m_timeLine.currentFrame(); const QRect animRect = QRect( m_sourceRect.x() + ((m_destRect.x() - m_sourceRect.x()) * f >> 6), m_sourceRect.y() + ((m_destRect.y() - m_sourceRect.y()) * f >> 6), m_sourceRect.width() + ((m_destRect.width() - m_sourceRect.width()) * f >> 6), m_sourceRect.height() + ((m_destRect.height() - m_sourceRect.height()) * f >> 6)); // by masking the widget the flicker when deleting the animation widget is reduced setMask(QRegion(animRect) + QRegion(m_destRect)); QPainter p(this); p.drawPixmap(m_destRect, m_old); if (m_needPixmapUpdate) { m_destWidget->removeEventFilter(this); m_new = QPixmap::grabWidget(m_destWidget); m_destWidget->installEventFilter(this); } p.setOpacity(0.5); p.drawPixmap(animRect, m_new); } Monday, January 14. 2008die letzten 6 Wochen in Sevilla! Es hat ein bisschen gedauert, bis ich hier "wirklich" angekommen bin....aber ich glaube, ich bin jetzt wieder richtig in Sevilla!! Am Anfang gab's nämlich nur schlechtes Wetter (kalt, Wolken, Regen) und so kenne ich diese Stadt ja gar nicht! Umso gemütlicher war es aber dafür in meiner WG und vor allem mit Indra und Caro. Wir haben uns bisher ungefähr jeden Tag getroffen, und haben uns gegenseitig getröstet Die Uni hat endlich wieder richtig angefangen, wird aber auch bald wieder aufhören: es gibt nur noch 1 Woche Uni, dann gibt's die Semanas Blancas (da lernt man für die Klausuren). Die Klausuren finden alle von Ende Januar bis Mitte Februar statt, aber die letzte mündliche Klausur ist irgendwann am 13.-15. Februar. Wer mich kennt, weiß, dass ich mich nicht von Klausuren abhalten lasse, andere "wichtigen" Sachen zu machen: Ende Januar kommt meine Freundin Nina zu Besuch PS: hiermit grüße ich das Geburtstagskind Susanne Gleichmann, denn heute wird sie 25 Jahre alt!! Gottes Segen dir! Monday, January 7. 2008gut angekommen... Ich bin "gut" angekommen. Statt um spätestens 12 Uhr war ich aber erst um 3 Uhr hier in der WG. Das erste Flugzeug hatte 45 min. Verspätung, das zweite 1,5 Stunden Als der Bus dann nach einer Stunde dann endlich kam, ging es um Leben und Tod. Sonst stellen sich die Spanier eher wie die Engländer in eine Schlange an, aber diesmal wurde um's Überleben gekämpft. HA! Und ICH, jawoll ich!, habe gewonnen! Ich hab mich erfolgreich nach vorne durch gedrängelt, sodass der Bus nicht ohne mich abfuhr. Toll oder? Sunday, January 6. 2008Ferien vorbei - ab morgen wieder in Sevilla Morgen früh fliege ich wieder zurück nach Sevilla. Beim Buchen meines Fluges hatte ich nur nach Preisen und nicht nach Uhrzeiten geguckt. Der Flieger geht schon um 6:30 Uhr!! Das heißt um ca. 4:30 Uhr am Flughafen sein. Dafür müsste ich die Bahn um 2:10 von Heidelberg nehmen... ich hab jetzt schon ganz viel Bock (nicht!)... Dafür sind es heute 20° in Sevilla und in der kommenden Woche zwischen 15-20°. Das ist echt sehr angenehm, es ist da außerdem fast immer sonnig und auch länger hell (bis ca.18:30 Uhr). Aber es gibt keine Heizungen in den Wohnungen. Es ist echt so SAUKALT drinnen! Ungemütlich¹°° ! Ich werde mich wohl wieder oft in die Sonne raussetzen müssen... Saturday, January 5. 2008Vorsätze für 2008 Amy fragt was unsere guten Vorsätze für 2008 sind. Das fände ich auch mal interessant von euch zu wissen! Ich will... - mehr Sport machen: möchte wieder regelmäßiger laufen gehen (habe mir gerade neue Laufschuhe gekauft - mehr für die Uni tun. Ich will endlich mal scheinfrei werden! Das braucht aber mind. noch 2 Semester, wenn ich mich ganz doll (vielleicht über-)anstrenge. Bisher war ich eher so'ne gemütliche Studiererin... Hmmm...mir fallen gerade noch viel mehr Sachen ein, die mir wichtig sind, und die ich verbessert sehen will, aber ich darf mir nicht zu viel auf einmal vornehmen. Ich bleibe also bei den 2 Sachen und habe den Ausgleich: Sport bringt Spaß und viel Arbeit gleicht das wieder aus Tuesday, January 1. 2008der erste Tag im neuen Jahr! Schon 2 Wochen bin ich wieder zu Hause und genieße es sogar so sehr, dass ich vergessen habe zu bloggen. Ganz kurzes Update: mir geht's viel besser (nach viel Antibiotikum), mache jeden Tag viel Musik am Klavier, singe wieder viel und bin auch geistlich wieder viel am Auftanken. Gestern Abend gab's bei uns Raclette (mit heißem Stein). Susanne & Hermann und Peter waren da, bzw. Peter ist immer noch da. Nach langem Ausschlafen heute Morgen (obwohl wir schon um 4 Uhr im Bett waren!), gab's erstmal einen fetten Brunch. Seit dem Brunch haben wir eigentlich nur noch The Battle of Wesnoth gespielt (jeder gegen jeden) übers Netzwerk Wir sind noch gar nicht aus dem Haus gekommen heute...und werden's wohl auch nicht mehr schaffen: Die Pizzen bei Joeys sind schon bestellt, und nachher gucken wir The Departed, eine DVD, die ich zu Weihnachten bekommen habe. Das war ein sehr cooler Gammeltag! Das Jahr 2008 hat gut begonnen Na, was habt ihr am ersten Tag im Jahr gemacht?? Thursday, December 13. 2007got a present today![]() Today I checked my mails and saw a few Phonon-related commits. I always read those commit messages with priority... and I was a bit surprised. I knew this day would come. But I didn't know when and I didn't know whether it's going to be GPL+commercial or LGPL. And I found the commit messages all said "[License: LGPL]". *dance* Now what does that license mean? It means everybody can contribute without having to sign a copyright assignment. That just makes it so much easier to handle contributions! Now I know what code I'm going to read and play with the next days. Tuesday, December 11. 2007Jetzt hat's mich doch noch erwischt! Okay, der Grund, warum ich schon länger nichts mehr geschrieben hab, ist ganz einfach: ich bin schon ne Weile krank In genau einer Woche bin ich endlich zu Hause und vereint mit meinem Seelenpartner Sunday, December 9. 2007going crazySaturday, December 8. 2007QWidget::render
![]() Yesterday on IRC I was reminded of the nice abstractions Qt has with QPaintDevice. (There are many useful paint devices, but most important for this discourse are QWidget, QPixmap and QImage.) So there are several things Qt4 allows you to do:
Inspired by the video from Mirco Müller I wanted to see what could be done with those functions. I started with setRedirected but couldn't make it work immediately. So I did what the docs said and tried QPixmap::grabWidget. And without much effort I was able to draw a widget someplace else. But then I wanted to transform the image which needs a conversion to QImage. Expecting that Qt might optimize a bit if it renders directly into a QImage instead of a QPixmap and then converts to QImage I used QWidget::render to render a widget directly onto a QImage. Piece of cake. Now I had a QImage, transformed and painted into a different widget. Last missing piece is to update the image if the original widget changes (e.g. mouse or keyboard events). QObject::installEventFilter makes it easy to listen for paint events on the other widget and update accordingly. And to make it a fully featured class I added the ability to look for child widget paint events and made it repaint only as little as needed. The result is this code: int main(int argc, char **argv) { QApplication app(argc, argv); QWidget topLevel; QWidget w(&topLevel); WidgetMirror leMirror(&topLevel); leMirror.setMirroredWidget(&w); QPushButton b("Button", &w); QLineEdit le(&w); QListWidget lw(&w); lw.setMaximumHeight(64); lw.addItems(QStringList() << "Item 1" << "Item 2" << "Item 3" << "Item 4" << "Item 5" << "Item 6" << "Item 7" << "Item 8"); QGridLayout layout(&w); layout.setMargin(0); layout.addWidget(&b, 0, 0, Qt::AlignBottom); layout.addWidget(&le, 0, 1, Qt::AlignBottom); layout.addWidget(&lw, 0, 2, Qt::AlignBottom); QVBoxLayout outerLayout(&topLevel); outerLayout.setSpacing(0); outerLayout.addWidget(&w); outerLayout.addWidget(&leMirror); topLevel.show(); return app.exec(); } which makes for this (All the artifacts and "unsmoothness" are results of the screen-capture). Today I wanted to see whether this eye-candy can be put into KDE at some place and I have not succeeded. Perhaps somebody can make a mockup of how this could be used without making you feel "something is wrong". Notice that all this is just fooling around with what Qt provides. This is neither useful nor going into KDE 4.0 For the interested people, the implementation of WidgetMirror looks like this: Continue reading "QWidget::render" Wednesday, December 5. 2007Sinterklaas![]() Hier in Spanje vieren ze geen Sinterklaas. Dat komt omdat hij vandaag op de boot naar Nederland gegaan is!
« previous page
(Page 2 of 7, totaling 104 entries)
» next page
|
Choose LanguageCalendar
QuicksearchArchivesCategoriesSyndicate This BlogBlog Administration |
|||||||||||||||||||||||||||||||||||||||||||||||||
