• 19182阅读
  • 9回复

一个最简单的QT布局的程序(QVBoxLayout),但是老是出不来我想要的布局,为什么呢? [复制链接]

上一主题 下一主题
离线jiayouwyhit
 
只看楼主 倒序阅读 楼主  发表于: 2011-03-27

各位版主,大侠,小弟在用QT做界面编辑,要用到最简单的布局管理器,以下是试验的代码,但总出不来想要的界面。麻烦各位帮帮看看究竟错在哪里了。谢谢了。

#include <qapplication.h>
#include <qmainwindow.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qpushbutton.h>

class MainWindow: public QMainWindow
{
public:
MainWindow()
{
QPushButton* Start = new QPushButton( this,"Start" );
QPushButton* Stop = new QPushButton( this,"Stop" );
QPushButton* Quit = new QPushButton( this,"Quit" );

QVBoxLayout* rightlayout = new QVBoxLayout;
rightlayout->addWidget( Start);
rightlayout->addWidget( Stop );
rightlayout->addWidget( Quit );
rightlayout->addStretch(1);
}
};

int main(int argc, char **argv)
{
QApplication a(argc, argv);

MainWindow mainWindow;
a.setMainWidget(&mainWindow);

mainWindow.resize(800,600);
mainWindow.show();

return a.exec();
}

下面是程序执行后显示的图,但是并不是我希望的那样,三个按钮竖直排列,且没有显示我给各个按钮起的名字。为什么啊?!

以上问题已经解决。谢谢三楼的提醒。

应该是把QVBoxLayout* rightlayout = new QVBoxLayout ;改为QVBoxLayout* rightlayout = new QVBoxLayout(this);就可以,我基本上是照着《C++ GUI QT3 编程》这本书140页写的。  现在发现书上的也不一定对啊。

但是现在新问题又出现了,我把MainWindow()构造函数的内容换为:

    QLabel *label = new QLabel("Timer Interval",this);
    QwtCounter *counter = new QwtCounter(this);
    counter->setRange(0.0,100.0,1.0);    
                     QHBoxLayout *layoutfirst = new QHBoxLayout(this);
                     layoutfirst->addWidget( label );
                     layoutfirst->addWidget( counter );
    
                    QVBoxLayout *leftlayout = new QVBoxLayout(this);
    

    
    leftlayout->addLayout( layoutfirst );


    QPushButton* Start = new QPushButton( this,"Start" );
                     Start->setText( tr( "&Start" ) );
    QPushButton* Stop = new QPushButton( this,"Stop" );
                     Stop->setText( tr( "&Stop" ) );
    QPushButton* Quit = new QPushButton( this,"Quit" );
                      Quit->setText( tr( "&Quit" ) );            
    QVBoxLayout* rightlayout = new QVBoxLayout(this);
    rightlayout->addWidget( Start);
    rightlayout->addWidget( Stop );
    rightlayout->addWidget( Quit );
    
    QHBoxLayout* mainlayout = new QHBoxLayout(this);
    mainlayout->setMargin(11);
    mainlayout->setSpacing(6);

    mainlayout->addLayout(rightlayout);
    mainlayout->addLayout(leftlayout);
  我主要想实现一下多重的这种布局嵌套,但是好像出不来我想要的布局,很纠结,不知道为啥,为毕设,在这块已经耗掉了我快整整两周了。大侠帮忙解答下为啥啊。最终的显示图形见下面第二个图。



[ 此帖被jiayouwyhit在2011-03-27 15:01重新编辑 ]
离线jiayouwyhit
只看该作者 1楼 发表于: 2011-03-27
自己给自己顶一下
离线wxj120bw

只看该作者 2楼 发表于: 2011-03-27
引用楼主jiayouwyhit于2011-03-27 09:46发表的 一个最简单的QT布局的程序(QVBoxLayout),但是老是出不来我想要的布局,为什么呢? :

各位版主,大侠,小弟在用QT做界面编辑,要用到最简单的布局管理器,以下是试验的代码,但总出不来想要的界面。麻烦各位帮帮看看究竟错在哪里了。谢谢了。

#include <qapplication.h>
#include <qmainwindow.h>
.......

QPushButton* Start = new QPushButton( 0,"Start" );
QPushButton* Stop = new QPushButton( 0,"Stop" );
QPushButton* Quit = new QPushButton( 0,"Quit" );

楼主尝试下这样 看能不能显示出来
离线roywillow

只看该作者 3楼 发表于: 2011-03-27
好像layout并没有加入到MainWindow中哦……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线jdwx

只看该作者 4楼 发表于: 2011-03-27
1:控件应该在.h里面声明为成员变量。
2:在构造函数里new出控件,添加到布局里。
3:最外面的布局放到窗口里。
到这里下本书看看 http://www.verycd.com/topics/2871397/
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jiayouwyhit
只看该作者 5楼 发表于: 2011-03-27
回 2楼(wxj120bw) 的帖子
行不通   谢谢
离线jiayouwyhit
只看该作者 6楼 发表于: 2011-03-27
回 3楼(roywillow) 的帖子
谢谢啊      问题解决了,应该是把QVBoxLayout* rightlayout = new QVBoxLayout ;改为QVBoxLayout* rightlayout = new QVBoxLayout(this);就可以,我基本上是照着《C++ GUI QT3 编程》这本书140页写的。  现在发现书上的也不一定对啊。

但是现在新问题又出现了,我想把MainWindow()构造函数的内容换为:

    QLabel *label = new QLabel("Timer Interval",this);
    QwtCounter *counter = new QwtCounter(this);
    counter->setRange(0.0,100.0,1.0);    
                     QHBoxLayout *layoutfirst = new QHBoxLayout(this);
                     layoutfirst->addWidget( label );
                     layoutfirst->addWidget( counter );
    
                    QVBoxLayout *leftlayout = new QVBoxLayout(this);
    

    
    leftlayout->addLayout( layoutfirst );


    QPushButton* Start = new QPushButton( this,"Start" );
                     Start->setText( tr( "&Start" ) );
    QPushButton* Stop = new QPushButton( this,"Stop" );
                     Stop->setText( tr( "&Stop" ) );
    QPushButton* Quit = new QPushButton( this,"Quit" );
                      Quit->setText( tr( "&Quit" ) );            
    QVBoxLayout* rightlayout = new QVBoxLayout(this);
    rightlayout->addWidget( Start);
    rightlayout->addWidget( Stop );
    rightlayout->addWidget( Quit );
    
    QHBoxLayout* mainlayout = new QHBoxLayout(this);
    mainlayout->setMargin(11);
    mainlayout->setSpacing(6);

    mainlayout->addLayout(rightlayout);
    mainlayout->addLayout(leftlayout);
  我主要想实现一下多重的这种布局嵌套,但是好像出不来我想要的布局,很纠结,不知道为啥,为毕设,在这块已经耗掉了我快整整两周了。大侠帮忙解答下为啥啊。
离线jiayouwyhit
只看该作者 7楼 发表于: 2011-03-27
回 4楼(jdwx) 的帖子
谢谢你了。我买了这本书的第三版。我比较菜,你说的第二条和第三条能给出具体的说明么?代码什么的
离线jiayouwyhit
只看该作者 8楼 发表于: 2011-03-27
解决了。保留QHBoxLayout* mainlayout = new QHBoxLayout(this);中的(this),去掉前面的新建布局中的(this)
离线roywillow

只看该作者 9楼 发表于: 2011-03-27
干嘛非要纠结this不this的……
QLayout本身就有addLayout成员函数
我记得QWidget也有addLayout成员函数
并且新加入的layout似乎是会被自动接管过去的
当然创建的时候如果指定了父对象会省去一些功夫大概,但是如果套的很多似乎就比较糊涂了吧……
再复杂的话用设计师设计好了
[ 此帖被roywillow在2011-03-27 22:28重新编辑 ]
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个