• 5426阅读
  • 12回复

close()(已解决) [复制链接]

上一主题 下一主题
离线sakiola
 
只看楼主 倒序阅读 楼主  发表于: 2009-07-23
我在一个窗体A里放了一个按钮a 然后点击这个按钮a时会创建另一个窗体B 覆盖当前的窗体A
在窗体B里也一样有一个按钮b  然后代码写的是点击这个按钮b的时候关闭这个窗口B 为什么不好用呢?

代码
A::A(QWidget *parent)
{
QPushButton * a = new QPushButton(this);
....
....
....
connect(a, SIGNAL(clicked()), this, SLOT(showb()));
}

B::B(QWidget *parent)
{
QPushButton * b = new QPushButton(this);
....
....
....
connect(b, SIGNAL(clicked()), this, SLOT(close()));
}

可以通过点击A的按钮a顺利生成B  可是为什么点击b的时候 B 不关闭呢?
[ 此帖被sakiola在2009-07-31 09:40重新编辑 ]
NB才是王道
离线sakiola
只看该作者 1楼 发表于: 2009-07-23
大家帮忙猜测下可能是哪里的原因~ 七嘴八舌就好 不要光溜达吗~
NB才是王道
离线rqzrqh

只看该作者 2楼 发表于: 2009-07-23
没进入事件循环吧,显示窗口B的时候要在后面添加一行app.exec();
看你的样子是把A作为主窗
离线sakiola
只看该作者 3楼 发表于: 2009-07-23
引用第2楼rqzrqh于2009-07-23 11:12发表的  :
没进入事件循环吧,显示窗口B的时候要在后面添加一行app.exec();
看你的样子是把A作为主窗

app.exec()中的app是main.cpp里的用QApplication定义的那个吗?
NB才是王道
离线rqzrqh

只看该作者 4楼 发表于: 2009-07-23
恩。不过在这里需要再用一个
离线sakiola
只看该作者 5楼 发表于: 2009-07-23
引用第2楼rqzrqh于2009-07-23 11:12发表的  :
没进入事件循环吧,显示窗口B的时候要在后面添加一行app.exec();
看你的样子是把A作为主窗

那个东西不是在main.cpp里边就调用一次就好了吗?
多次调用会出错的吧?再说 我的类的定义放到另外一个文件写的
调用app.exec也不可能能认识app吧?
NB才是王道
离线sakiola
只看该作者 6楼 发表于: 2009-07-23
引用第4楼rqzrqh于2009-07-23 11:20发表的  :
恩。不过在这里需要再用一个

再用一个的话 要重新定义一个吗? 重新定义一个Qapplication 然后exec?
NB才是王道
离线sakiola
只看该作者 7楼 发表于: 2009-07-23
晕了晕了.......
NB才是王道
离线shiroki

只看该作者 8楼 发表于: 2009-07-23
楼上的可以溜达但别误导人家阿。  从贴的这段代码中看不出任何问题。 检查没贴出来的 部分吧, 比如B的头文件有没有加 Q_OBJECT之类的。 另外这个close函数你是自己重载了一个还是直接用的QWidget的close? 如果是自己重载的还得看看close里写了什么
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线sakiola
只看该作者 9楼 发表于: 2009-07-23
引用第8楼shiroki于2009-07-23 11:37发表的  :
楼上的可以溜达但别误导人家阿。  从贴的这段代码中看不出任何问题。 检查没贴出来的 部分吧, 比如B的头文件有没有加 Q_OBJECT之类的。 另外这个close函数你是自己重载了一个还是直接用的QWidget的close? 如果是自己重载的还得看看close里写了什么


close 没重写 嘿嘿 说实话 我不会重写close HOHO~~ 用的是QWidget自带的close

诺~ 代码~

class test : public QWidget
{
    Q_OBJECT

public:
    test(QWidget *parent = 0);
    ~test();
private slots:
    void showPa();
private:
};

class project : public QWidget
{
    Q_OBJECT

public:
    project(QWidget *parent = 0);
    ~project();
private slots:
    void showSon();
private:
    test *asss;
};
========================================
project::project(QWidget *parent)
    : QWidget(parent)
{
    setWindowFlags(Qt::FramelessWindowHint);
    setGeometry(0,25,320,190);

    QPushButton * btn = new QPushButton(this);
    btn->setText("call-son");
    btn->setGeometry(100,100,100,25);
    connect(btn, SIGNAL(clicked()), this, SLOT(showSon()));
}


void project::showSon()
{
    //this->hide();
    asss = new test();
    //asss->setParent(this);
    //if(asss->parentWidget())
    asss->show();
    //this->hide();
}

project::~project(){}

test::test(QWidget *parent)
    : QWidget(parent)
{
    setWindowFlags(Qt::FramelessWindowHint);
    setGeometry(0,25,320,190);

    QPushButton * btnd = new QPushButton(this);
    btnd->setText("call-parent");
    btnd->setGeometry(100,120,100,25);
    connect(btnd, SIGNAL(clicked), this, SLOT(showPa()));
}

void test::showPa()
{
    //QWidget * pa;
    //pa = this->parentWidget();
    //this->hide();
    //pa->activateWindow();
    this->close();
}
test::~test(){}

目的很简单 就是想能在两个窗体之间切换

按主界面call-son按钮能显示下一个widget

按call-parent把当前第二个窗体hide起来

再不就直接调用父窗体的show 不过没好用

就打算关闭子窗体 结果还是不好用撒
[ 此帖被sakiola在2009-07-23 12:59重新编辑 ]
NB才是王道
离线sakiola
只看该作者 10楼 发表于: 2009-07-23
还有~ 之前在创建test的时候传入了this指针 形如asss = new test(this);

想使第二个窗体作为第一个窗体的子窗体并通过parentWidget->show来显示第一个窗体的

发现按完call-son之后 新出来的widget有两个button

可是当我点击call-parent的时候完全没效果 而且窗体就剩下了一个(当我无意拖走之后只有一个带着两个button的窗体 无奈。。。)

检查了下parentWidget返回的貌似是0

猜想是不是我创建test对象的时候就没正确的确定test的父窗体呢? 然后就打算手动设置

调用了asss->setParent(this); 结果没效果 貌似还是没设置成功 调用parentWidget还是不显示

后来想是不是应该用activateWindow() 可是试过之后还是不好用... 最后无奈了才用的close 结果更让我失望。。。。
NB才是王道
离线shiroki

只看该作者 11楼 发表于: 2009-07-23
    connect(btnd, SIGNAL(clicked), this, SLOT(showPa()));
这行少了个括号
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线sakiola
只看该作者 12楼 发表于: 2009-07-23
引用第11楼shiroki于2009-07-23 14:02发表的  :
    connect(btnd, SIGNAL(clicked), this, SLOT(showPa()));
这行少了个括号

对不起版大了~ 以后自己注意 都怪编译器不告诉我一声。。。。错错错 都怪我太不小心。。。
NB才是王道
快速回复
限100 字节
 
上一个 下一个