不明白为什么我不能在QMainWindow子类中调用setCentralWidget

时间:2011-02-09 17:52:03

标签: c++ qt qt4

//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 }

我得到的错误是:

/usr/include/qt4/QtGui/qwidget.h ::在构造函数'CLPoster :: CLPoster()'中: /usr/include/qt4/QtGui/qwidget.h:787:错误:'QWidget :: QWidget(const QWidget&)'是私有的 /home/brett/projects/CLPoster/CLPoster-build-desktop/../CLPoster/clposter.cpp:9:错误:在此上下文中 /home/brett/projects/CLPoster/CLPoster-build-desktop/../CLPoster/clposter.cpp:10:错误:没有匹配函数来调用'CLPoster :: setCentralWidget(QWidget&)' /usr/include/qt4/QtGui/qmainwindow.h:141:候选人是:void QMainWindow :: setCentralWidget(QWidget *)

我在解释错误消息时遇到问题。它说没有匹配的函数调用,但它应该从QMainWindow继承它。它可能只是缺乏对Q ++的理解,而不是QT,我第一次使用它,但不知道。谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

setCentralWidget函数希望您向QWidget(QWidget*)发送指针,而您尝试发送实际对象(或对您的代码中的对象QWidget&,如编译器错误所暗示的那样)。如果您将中央窗口小部件创建为指针(将成员函数更改为QWidget* createCentralWidget())并将指针传递给setCentralWidget函数,那么您应该很高兴。

e.g。

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

然后在你的构造函数中,你可以调用setCentralWidget(createCentralWidget())。 QMainWindow析构函数将确保删除您的中央窗口小部件。

答案 1 :(得分:1)

所有QWidget项目必须在免费商店(new)中分配,因为他们都必须拥有“父母”。在Qt中,父级将删除其子级(使用delete)。这就是为什么任何函数返回,接受,无论小部件将在指向窗口小部件的指针上执行此操作,而不是窗口小部件本身;你需要这样做。

答案 2 :(得分:0)

您是否需要在堆上分配Widget并将指针传递给setCentralWidget()