开发者

Don't understand why I can't call setCentralWidget in QMainWindow subclass

//clposter.h
class CLPoster : public QMainWindow
{
    Q_OBJECT

public: CLPoster();

private slots: QWidget createCentralWidget(); void createActions(); void createMenu(); void createStatusBar(); void loadSavedPosts(); };

//clposter.cpp
CLPoster::CLPoster()
{
    setWindowTitle("Craigslist Poster");

QWidget mainWidget = createCentralWidget();
setCentralWidget(mainWidget);

// createActions(); // createMenu(); // createStatusBar();

// loadSavedPosts(); // checkForActionsNeeded(); //May want to break up into more functions }

The error I'm开发者_JAVA百科 getting is this:

/usr/include/qt4/QtGui/qwidget.h:: In constructor ‘CLPoster::CLPoster()’: /usr/include/qt4/QtGui/qwidget.h:787: error: ‘QWidget::QWidget(const QWidget&)’ is private /home/brett/projects/CLPoster/CLPoster-build-desktop/../CLPoster/clposter.cpp:9: error: within this context /home/brett/projects/CLPoster/CLPoster-build-desktop/../CLPoster/clposter.cpp:10: error: no matching function for call to ‘CLPoster::setCentralWidget(QWidget&)’ /usr/include/qt4/QtGui/qmainwindow.h:141: candidates are: void QMainWindow::setCentralWidget(QWidget*)

I'm having trouble interpreting the error message. It says there is no matching function call, but it should be inheriting it from QMainWindow. It could just be a lack of understanding C++ more so than QT, first time I've used it, but dunno. Thanks for the help.


All QWidget items must be allocated in the free-store (new) since they all have to have "parents". In Qt a parent will delete its children (with delete). This is why any function returning, accepting, whatever a widget is going to do so on a pointer to a widget, not the widget itself; you need to do the same.


The setCentralWidget function expects that you are sending a pointer to a QWidget (QWidget*), whereas you are trying to send the actual object (or a reference to the object, QWidget&, as implied by the compiler error) in your code. If you create your central widget as a pointer (change the member function to QWidget* createCentralWidget()) and pass the pointer to the setCentralWidget function you should be good to go.

e.g.

QWidget* CLPoster::createCentralWidget()
{
   QWidget* w = new QWidget;
   // Do stuff..
   return w;
}

Then in your constructor, you can just call setCentralWidget(createCentralWidget()). The QMainWindow destructor will ensure that your central widget is deleted.


Don't you need to allocate the Widget on the heap and pass a pointer to setCentralWidget()

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜