• 12778阅读
  • 17回复

[提问]QT多窗口切换问题 [复制链接]

上一主题 下一主题
离线土拨鼠
 

只看楼主 倒序阅读 楼主  发表于: 2012-05-31
初学者,提问之前也搜了类似的帖子,不过没有确切的结果,请指点。

我想完成的功能类似于:3个窗口,MAIN, profile, config,从main点一个pushbotton跳转到profile,从profile中点击一个pushbotton跳转到config,在config中点击一个按钮跳转到main。(实际上不止这些窗口和按钮,但原理就是这样)

我的做法是:在main类中,有两个private成员指针,在MainWindow的构造函数中给它们分配空间,并且把this指针传给他们做parent,
然后在对应MAIN窗口按钮点击signal的slot中,使用

void MainWindow::on_pushButton_profile_clicked()
{
    this->hide();
    profile->show();
    profile->exec();
    this->show();
}

然后可以顺利跳转。

我碰到的问题是:不知道如何从profile跳转到config,其实就是不知道如何在profile类中访问config,他们都是MainWindow的子窗口,我本来想在profile类的跳转到config的按键的处理函数中先找到parent,再用parent访问config,类似

// in profile.cpp

...
void Profile::on_pushButton_config_clicked( )
{
    this->close();                           // 这里应该是hide还是close?
    this->parent->config->show();  // fake code
    this->parent->config->exec();   // fake code
}

这里对parent的用法是错误的,我这里不知道如何写,所以用这样的代码来表达我的意图。

请大家指点。

另外我是初学,如果哪位有类似的界面跳转的简单例程,方便的话请发给我做个参考。

我的qq: 9644089
邮箱:9644089@qq.com
谢谢




它们关系如下:

// in mainwindow.h
...
class MainWindow : public QMainWindow
{
    ...
    private:
    Ui::MainWindow *ui;
    Profile *profile;
    Config  *config;
};

// in MainWindow.cpp
// in MainWindow's constructor

   ...
   profile = new Profile(this);
   config = new Config(this);

离线passion_wu
只看该作者 1楼 发表于: 2012-05-31
Qt窗口指针只要没做delete操作,hide和close效果是一样的,因为close并不会delete掉窗口指针,除非你设置了Qt::WA_DeleteOnClose
第二个问题:Config指针没有必要在MainWidow中声明
可以这样写:
void Profile::on_pushButton_config_clicked( )
{
    this->hide();
   Config config(this);  //使用对象而不是指针的好处是本函数结束后内存自动释放
   config.exec();
}
1条评分好评度+1
liyuhao 好评度 +1 - 2020-06-21
离线土拨鼠

只看该作者 2楼 发表于: 2012-05-31
多谢LS兄弟。
还有个疑问:如果我在A窗口做了一些设置并保存(或者没有保存),然后点击next进入B窗口,然后再back,回到A窗口,
在你的这种方法当中,当B回到A窗口时,其实是新建了一个A',那原来A上的一些设置之类的历史数据,如何继承下来并显示在新窗口A'上?
离线土拨鼠

只看该作者 3楼 发表于: 2012-05-31
补充一下,这几个页面不是链表那样线性的,互相之间可能需要随意跳转,

比如main可以到profile也可以到config,profile可以到main也可以到config,config也可以到另外两个。

然后整个系统中,页面不算多,资源不是太大问题。

所以我一开始就想把它们都建个实例,然后程序运行期间常驻内存。

当然这是我闭门造车的想法。
离线uidab

只看该作者 4楼 发表于: 2012-05-31
回 4楼(土拨鼠) 的帖子
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线土拨鼠

只看该作者 5楼 发表于: 2012-05-31
LS兄,多谢!
你的例子我看了,两个窗口,也是一个做主窗口,然后有一个成员是子窗口。
我现在主窗口和它的子窗口互相跳转没有问题,因为主窗口中可以直接调用子窗口的show(),子窗口要回去的话就hide()自己。

我现在碰到的困难是,如果这个主窗口有2个子窗口,它们之间互相跳转,是怎么做?比如A是主,B和C是子,B要跳到C,如何调用c的show()函数?

谢谢。
离线uidab

只看该作者 6楼 发表于: 2012-05-31
回 6楼(土拨鼠) 的帖子
和这个类似啊,B跳转到C ,就把B当作主,C当作副。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线土拨鼠

只看该作者 7楼 发表于: 2012-05-31
回 7楼(uidab) 的帖子
但是C也可能跳转到B,MAIN
等于说,这些窗口其实是平等的,我把一个设为主,只是为了初始化起来方便。
实际上我有十来个窗口,任意两个之间都可能跳转,
所以不能永远从主跳到副啊,
离线xie133
只看该作者 8楼 发表于: 2012-05-31
QT这么好用的信号与槽你多不用,纠结这么久,假设A是主窗口,B,C是子窗口,B要调用C,c->show,然后b->hide,这个应该没问题吧, 然后连接一个信号与槽,当C要返回b,发送一个信号给B,B在槽里面show自己,然后C自己把自己给hide.反正方法多的是, 你用A窗口做传递也可以。
离线uidab

只看该作者 9楼 发表于: 2012-05-31
回 8楼(土拨鼠) 的帖子
那其实就是窗口间参数传递和窗口显示的问题, 9楼的方法可以,不用信号也可以。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线xie133
只看该作者 10楼 发表于: 2012-05-31
信号与槽就是一个触发标志,发送一个信号相当于一个对象告诉另外一个对象,你该hide,该干嘛干嘛去。。
离线jdwx

只看该作者 11楼 发表于: 2012-05-31
信号和槽在这种情况下不适用。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线xie133
只看该作者 12楼 发表于: 2012-05-31
引用第12楼jdwx于2012-05-31 15:25发表的  :
信号和槽在这种情况下不适用。


为什么不适用?
离线土拨鼠

只看该作者 13楼 发表于: 2012-05-31
两个副窗口之间互相看不到的话,B的SIGNAL和C的SLOT怎么connect?
换句话说,如果b能看见c,我也没必要发给c的SLOT了,直接c.show()就可以了。
不过b给mainwindow发信号,然后由 main来调度应该可以。谢了
离线xie133
只看该作者 14楼 发表于: 2012-06-01
如果b能看见C,你也说了,只能c.show,但是c返回的时候呢?C还能把b show出来, 按你这种说话,信号与槽实际就没意义了,任何情况下多可以调用函数,实际上信号与槽本身就是一个回调函数而已。
离线土拨鼠

只看该作者 15楼 发表于: 2012-06-02
another probelm met:

now I use MainWindow to control the child’s switch, when child B want switch to child C, it emit a signal to the MainWindow, and the MainWindow does:


1.b.hide();
2.c.show();
3.c.exec();

and when child C want to switch to child B, the MainWindow does:


1.c.hide();
2.b.show();
3.b.exec();

After successfully switch from MainWindow to B, and from B to C, now the problem is, when want switch back to C from B, it directly jump to MainWindow, with warning as following:

Dialog::exec() recursive call
seems that I abused the exec() in my code.

What’s the way out? thanks.
.
离线zegler001

只看该作者 16楼 发表于: 2012-07-07
楼主现在问题应该解决了吧?我现在也碰到一个相似 的问题,就是从A跳到B,B跳到C,C跳到D,D跳到A,时间触发的方式是使用定时器,点击鼠标的时候进入主界面,大概思路就是这样,请你给我一些参考代码号码?我是新手,多谢了,我的邮箱是290906153@qq.com.
离线boddeng
只看该作者 17楼 发表于: 2012-09-05
求楼主的源代码 发份学习 470970006qq.com
快速回复
限100 字节
 
上一个 下一个