• 11717阅读
  • 9回复

QGridLayout::addWidget老报错,救命啊!!! [复制链接]

上一主题 下一主题
离线l_xin
 
只看楼主 正序阅读 楼主  发表于: 2009-08-21
error: no matching function for call to `QGridLayout::addWidget(MovieWindow*&, int, int, Qt::Orientation)'
折腾了2个多小时,没找出咋回事…………,我是按照http://doc.trolltech.com/4.3/tutorial-t6.html这里的课程,做的练习,疯了……

高手拯救下小弟。



相关代码:
void MainWindow::ChangeInfo(Movie movie,int &num)
{
    MovieWindow *movies = new MovieWindow;
    gridLayout->addWidget(movies,1,1,Qt::Horizontal);
}



MovieWindow是我建的一个类:
头文件中:
class MovieWindow : public QWidget
{
    Q_OBJECT
public:
    MovieWindow(QWidget *parent = 0);
    ~MovieWindow();
private:
    QPushButton *btn;
    QLabel *lb;
    QWebView *view;
    QVBoxLayout *boxLayout;
};

源文件中:

MovieWindow::MovieWindow(QWidget *parent): QWidget(parent)
{
    boxLayout = new QVBoxLayout();
    view = new QWebView(this);
    QPushButton *btn = new QPushButton(this);
    view->load(QUrl("http://192.122.139.192/image/17Again.jpg"));
    view->setSizeIncrement(150,200);
    btn->setText("watch");
    boxLayout->addWidget(view);
    boxLayout->addWidget(btn);
    setLayout(boxLayout);
}
MovieWindow::~MovieWindow()
{
delete btn;
delete lb;
delete view;
delete boxLayout;
}
离线roywillow

只看该作者 9楼 发表于: 2011-03-08
QMainWindow是已经有自己的layout了,如果中心区域要放很多东西,不妨把一个QWidget放到中间,然后在这个QWidget中放layout和各种组件

还有,我记得QGridLayout的参数比较多,除了位置以外,后面还跟着rowSpan和columnSpan,之后才是对齐方式,所以如果你省略了那两个参数那么最后的对齐方式也得省略掉
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线devil878
只看该作者 8楼 发表于: 2011-03-08
更详细的答案,虽然是以前的问题了,但是最近我也碰到这问题,解决后于是发此贴,已保证以后有同样麻烦的人不会再被这问题迷惑
首先让我看下QLayout的一个构造函数的写法
QLayout::QLayout    (    QLayoutPrivate &     d,
QLayout *     ,
QWidget *          
)             [protected]
Definition at line 104 of file qlayout.cpp.

References addItem(), d, invalidate(), QObject::objectName(), qWarning(), QObject::setParent(), and w.

00105     : QObject(dd, lay ? static_cast<QObject*>(lay) : static_cast<QObject*>(w))
00106 {
00107    Q_D(QLayout);
00108      if (lay) {
00109         lay->addItem(this);
00110     } else if (w) {
00111         if (w->layout()) {
00112             qWarning("QLayout: Attempting to add QLayout \"%s\" to %s \"%s\", which"
00113                      " already has a layout",
00114                      qPrintable(QObject::objectName()), w->metaObject()->className(),
00115                      w->objectName().toLocal8Bit().data());
00116             setParent(0);
00117         } else {
00118             d->topLevel = true;
00119             w->d_func()->layout = this;
00120             invalidate();
00121         }
00122     }
00123 }

楼主的提示是因为第00112行的那句话,所以简单来说,楼主在mainwindows里面构造一个layout的时候调用了
QLayout::QLayout    (    QLayoutPrivate &     d,
QLayout *     ,
QWidget *          
)    
,
举例来说
我在mainwindows 写m_layout = new QGridLayout可以而写成m_layout = new QGridLayout(this)则不行,原因,见于上面的代码
离线rqzrqh

只看该作者 7楼 发表于: 2009-08-21
引用第6楼xtfllbl于2009-08-21 17:38发表的  :
mainwindow默认就有layout的意思,你可以自己创建个layout,把东西放进去,不要放到mainwindow的layout里去。
最好的办法就是自己写界面,不要用desiner,creator
学到了
离线xtfllbl

只看该作者 6楼 发表于: 2009-08-21
mainwindow默认就有layout的意思,你可以自己创建个layout,把东西放进去,不要放到mainwindow的layout里去。
最好的办法就是自己写界面,不要用desiner,creator
上海欢迎您
离线l_xin
只看该作者 5楼 发表于: 2009-08-21
引用第4楼xtfllbl于2009-08-21 16:56发表的  :
你是这样写的:
addWidget(MovieWindow*&, int, int, Qt::Orientation)
gridLayout->addWidget(movies,1,1,Qt::Horizontal);
error: no matching function for call::这句话的意思是系统没有你这么写法的函数,就是参数给的不对的意思,好好看看文档先



确实,我把
gridLayout->addWidget(movies,1,1,Qt::Horizontal);
改成:
gridLayout->addWidget(movies,1,1);

不报错了,但是运行的时候,总会有这句:QLayout: Attempting to add QLayout "" to MainWindow "", which already has a layout
离线xtfllbl

只看该作者 4楼 发表于: 2009-08-21
你是这样写的:
addWidget(MovieWindow*&, int, int, Qt::Orientation)
gridLayout->addWidget(movies,1,1,Qt::Horizontal);

error: no matching function for call::这句话的意思是系统没有你这么写法的函数,就是参数给的不对的意思,好好看看文档先
上海欢迎您
离线dbzhang800

只看该作者 3楼 发表于: 2009-08-21
把你的MainWindow:贴出来看看
离线l_xin
只看该作者 2楼 发表于: 2009-08-21
引用第1楼netlove于2009-08-21 16:25发表的  :
MovieWindow *movies = new MovieWindow(this);
这样试一下



还是一样的报错,NOTE也都是这几个:
note: candidates are: void QGridLayout::addWidget(QWidget*)
note:                 void QGridLayout::addWidget(QWidget*, int, int, Qt::Alignment)
note:                 void QGridLayout::addWidget(QWidget*, int, int, int, int, Qt::Alignment)

貌似方法重载的时候出问题
离线netlove

只看该作者 1楼 发表于: 2009-08-21
MovieWindow *movies = new MovieWindow(this);
这样试一下
快速回复
限100 字节
 
上一个 下一个