Revision: 56224
http://sourceforge.net/p/brlcad/code/56224
Author: vladbogo
Date: 2013-07-25 20:51:36 +0000 (Thu, 25 Jul 2013)
Log Message:
-----------
Use QWindow instead of QWidget so that Qt could be successfully embedded in Tk.
Modified Paths:
--------------
brlcad/trunk/include/dm-qt.h
brlcad/trunk/src/libdm/dm-qt.cpp
Modified: brlcad/trunk/include/dm-qt.h
===================================================================
--- brlcad/trunk/include/dm-qt.h 2013-07-25 18:47:11 UTC (rev 56223)
+++ brlcad/trunk/include/dm-qt.h 2013-07-25 20:51:36 UTC (rev 56224)
@@ -28,22 +28,33 @@
#ifdef DM_QT
# include <QApplication>
-# include <QWidget>
# include <QPainter>
+# include <QWindow>
+# include <QBackingStore>
+# include <QResizeEvent>
-class QTkMainWindow: public QWidget {
+class QTkMainWindow: public QWindow {
public:
- QTkMainWindow(QPixmap *pix, WId win);
+ QTkMainWindow(QPixmap *p, QWindow *parent = 0);
+ virtual void render(QPainter *painter);
+public slots:
+ void renderNow();
+
protected:
- void paintEvent(QPaintEvent *event);
+ bool event(QEvent *event);
+ void resizeEvent(QResizeEvent *event);
+ void exposeEvent(QExposeEvent *event);
+
private:
QPixmap *pixmap;
-
+ QBackingStore *m_backingStore;
+ bool m_update_pending;
};
+
struct qt_vars {
QApplication *qapp;
QTkMainWindow *win;
Modified: brlcad/trunk/src/libdm/dm-qt.cpp
===================================================================
--- brlcad/trunk/src/libdm/dm-qt.cpp 2013-07-25 18:47:11 UTC (rev 56223)
+++ brlcad/trunk/src/libdm/dm-qt.cpp 2013-07-25 20:51:36 UTC (rev 56224)
@@ -82,6 +82,7 @@
privars->painter->setPen(privars->fg);
privars->painter->setFont(*privars->font);
+ bu_log("drawBegin called\n");
return TCL_OK;
}
@@ -89,7 +90,7 @@
HIDDEN int
qt_drawEnd(struct dm *dmp)
{
- struct qt_vars *privars = (struct qt_vars *)dmp->dm_vars.priv_vars;
+ struct qt_vars *privars = (struct qt_vars *)dmp->dm_vars.priv_vars;
privars->painter->end();
delete privars->painter;
privars->painter = NULL;
@@ -254,10 +255,6 @@
dmp->dm_bg[1] = g;
dmp->dm_bg[2] = b;
- QPalette pal = privars->win->palette();
- pal.setColor(QPalette::Background, privars->bg);
- privars->win->setPalette(pal);
-
privars->pix->fill(privars->bg);
return TCL_OK;
@@ -534,20 +531,62 @@
};
-QTkMainWindow::QTkMainWindow(QPixmap *pix, WId win)
-:QWidget()
+QTkMainWindow::QTkMainWindow(QPixmap *p, QWindow *win)
+ : QWindow(win)
+ , m_update_pending(false)
{
- create(win, false, true);
- pixmap = pix;
+ m_backingStore = new QBackingStore(this);
+ create();
+ pixmap = p;
+
}
-void QTkMainWindow::paintEvent(QPaintEvent *UNUSED(event))
+void QTkMainWindow::exposeEvent(QExposeEvent *)
{
- QPainter painter(this);
- painter.drawPixmap(0, 0, *pixmap);
+ if (isExposed()) {
+ renderNow();
+ }
}
+void QTkMainWindow::resizeEvent(QResizeEvent *resizeEv)
+{
+ m_backingStore->resize(resizeEv->size());
+ if (isExposed())
+ renderNow();
+}
+bool QTkMainWindow::event(QEvent *ev)
+{
+ if (ev->type() == QEvent::UpdateRequest) {
+ m_update_pending = false;
+ renderNow();
+ return true;
+ }
+ return QWindow::event(ev);
+}
+
+void QTkMainWindow::renderNow()
+{
+ if (!isExposed())
+ return;
+
+ QRect rect(0, 0, width(), height());
+ m_backingStore->beginPaint(rect);
+
+ QPaintDevice *device = m_backingStore->paintDevice();
+ QPainter painter(device);
+
+ render(&painter);
+
+ m_backingStore->endPaint();
+ m_backingStore->flush(rect);
+}
+
+void QTkMainWindow::render(QPainter *painter)
+{
+ painter->drawPixmap(0, 0, *pixmap);
+}
+
__BEGIN_DECLS
/*
@@ -694,13 +733,20 @@
pubvars->win = Tk_WindowId(pubvars->xtkwin);
dmp->dm_id = pubvars->win;
+ Tk_SetWindowBackground(pubvars->xtkwin, 0);
+ Tk_MapWindow(pubvars->xtkwin);
privars->qapp = new QApplication(argc, argv);
+ QWindow *window = QWindow::fromWinId(pubvars->win);
+
privars->pix = new QPixmap(dmp->dm_width, dmp->dm_height);
- privars->win = new QTkMainWindow(privars->pix, (WId)pubvars->win);
- privars->win->resize(dmp->dm_width, dmp->dm_height);
- privars->win->setAutoFillBackground(true);
+ privars->win = new QTkMainWindow(privars->pix, window);
+ privars->win->create();
+ privars->win->setWidth(dmp->dm_width);
+ privars->win->setHeight(dmp->dm_height);
+
+ privars->win->show();
privars->font = NULL;
qt_configureWin(dmp, 1);
@@ -708,11 +754,7 @@
privars->painter = NULL;
qt_setFGColor(dmp, 1, 0, 0, 0, 0);
qt_setBGColor(dmp, 0, 0, 0);
- privars->win->show();
- Tk_SetWindowBackground(pubvars->xtkwin, 0);
- Tk_MapWindow(pubvars->xtkwin);
-
bu_log("qt_open called\n");
return dmp;
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits