PDA

View Full Version : Tiny problem in using QCanvas/QCanvasView and QWidgetStack



luffy27
19th April 2007, 16:13
I have a QMainWindow and a QWidgetStack as its central widget. The QWidgetStack contains two widgets which are QTextEdit and QCanvasView. And then I switch the two widgets to show by turns by clicking a pushbutton. The switching performance works well. But when I change the central widget from QTextEdit to the QCanvasView, it appears a two white lines on the canvasview. Since I have not added any code for drawing items, this is very strange. I am confused!
Below is my code:


#include <qapplication.h>
#include <qstring.h>
#include <qmainwindow.h>
#include <qdockwindow.h>
#include <qtextedit.h>
#include <qtoolbar.h>
#include <qtoolbutton.h>
#include <qpopupmenu.h>
#include <qwidgetstack.h>
#include <qhbox.h>
#include <qlayout.h>
#include <qcanvas.h>

class MainWindow:public QMainWindow
{
Q_OBJECT
public:
MainWindow(const QString& filename );
QDockWindow *toolBarDockWindow;
QWidgetStack *toolBarStack;
QWidgetStack *centralWidgetStack;
QToolButton* graphicButton;
QToolButton* quitButton;
QTextEdit *textEdit;
QCanvasView* canvasView;
QCanvas* m_canvas;
public slots:
void switchToolBarMode();
void switchCentralWidgetMode(int);
private:
void init();
QString m_filename;
bool m_toolBarMode;
};


MainWindow::MainWindow(const QString& filename)
:QMainWindow(0,0,WDestructiveClose)
{
int screenW;
int screenH;
screenW = QApplication::desktop()->width();
screenH = QApplication::desktop()->height();
this->resize(screenW,screenH);
m_filename = QString::null;
m_toolBarMode = TRUE;
init();
}

void MainWindow::init()
{
toolBarDockWindow = new
QDockWindow(QDockWindow::InDock,this,"toolbardockwindow",0);
toolBarDockWindow->setOrientation(Qt::Horizontal);
toolBarDockWindow->setHorizontallyStretchable(TRUE);
toolBarDockWindow->setVerticallyStretchable(TRUE);
toolBarDockWindow->setMovingEnabled(FALSE);
this->moveDockWindow(toolBarDockWindow,Qt::DockBottom);

toolBarStack = new QWidgetStack(toolBarDockWindow);
toolBarDockWindow->setWidget(toolBarStack);
QWidget* editToolBar = new QWidget(toolBarStack);
QHBoxLayout* editToolBarLayout = new QHBoxLayout(editToolBar,6,6);
QWidget* graphicToolBar = new QWidget(toolBarStack);
QHBoxLayout* graphicToolBarLayout = new QHBoxLayout(graphicToolBar,6,6);
toolBarStack->addWidget(editToolBar,0);
toolBarStack->addWidget(graphicToolBar,1);
graphicButton = new QToolButton(editToolBar,"graphicutton");
graphicButton->setUsesTextLabel(TRUE);
graphicButton->setTextLabel("Graphic",FALSE);
graphicButton->setFont(QFont("Times",20,QFont::Bold));
editToolBarLayout->addWidget(graphicButton);

QSpacerItem* editToolBarSpacer = new
QSpacerItem(0,0,QSizePolicy::Expanding,QSizePolicy ::Minimum);
editToolBarLayout->addItem(editToolBarSpacer);
quitButton = new QToolButton(graphicToolBar,"quitbutton");
quitButton->setUsesTextLabel(TRUE);
quitButton->setTextLabel("Return",FALSE);
quitButton->setFont(QFont("Times",20,QFont::Bold));
graphicToolBarLayout->addWidget(quitButton);


QSpacerItem* graphicToolBarSpacer = new QSpacerItem(0,0,QSizePolicy::Expanding,QSizePolicy ::Minimum);
graphicToolBarLayout->addItem(graphicToolBarSpacer);

toolBarStack->raiseWidget(0);
connect(graphicButton,SIGNAL(clicked()),this,SLOT( switchToolBarMode()));
connect(quitButton,SIGNAL(clicked()),this,SLOT(swi tchToolBarMode()));

centralWidgetStack = new QWidgetStack(this);
textEdit = new QTextEdit(centralWidgetStack,"textedit");
textEdit->setTextFormat(Qt::PlainText);
textEdit->setFocus();
centralWidgetStack->addWidget(textEdit,0);

canvasView = new QCanvasView(centralWidgetStack,"canvasview");
m_canvas = new QCanvas(this);
m_canvas->resize(centralWidgetStack->width(),centralWidgetStack->height());
m_canvas->setBackgroundColor(black);
canvasView->setCanvas(m_canvas);
centralWidgetStack->addWidget(canvasView,1);
centralWidgetStack->raiseWidget(0);

this->setCentralWidget(centralWidgetStack);
connect(toolBarStack,SIGNAL(aboutToShow(int)),this ,SLOT(switchCentralWidgetMode(int)));
}

void MainWindow::switchCentralWidgetMode(int i)
{
centralWidgetStack->raiseWidget(i);

}

void MainWindow::switchToolBarMode()
{
if(m_toolBarMode){
toolBarStack->raiseWidget(1);
}else{
toolBarStack->raiseWidget(0);
}
m_toolBarMode = !m_toolBarMode;
}

int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QString filename = QString::null;
MainWindow *mainWindow = new MainWindow(filename);
app.setMainWidget(mainWindow);
mainWindow->show();

return app.exec();
}

#include "mainwindow.moc"


I think the problem is the canvas resize process. Because after I comment off the "m_canvas->resize()"
the white lines disappear. But the Qt's documents say that when constructs a canvas without giving its constructor a width and height arguements, you should resize it before using it. So how should I resize the canvas?

Thanks a lot.

marcel
19th April 2007, 16:56
canvasView = new QCanvasView(centralWidgetStack,"canvasview");
m_canvas = new QCanvas(this);
m_canvas->resize(centralWidgetStack->width(),centralWidgetStack->height());

Here centralWidgetStack hasn't been yet resized to fit it's contents. It hasn't been shown yet.

I suggest resizing the canvas prior to switching between widgets ( maybe in switchToolbarMode() ).

regards