• 16028阅读
  • 29回复

多个窗口中的部件应怎样做才能相互控制?(大讨论) [复制链接]

上一主题 下一主题
离线rockyluo
 

只看楼主 倒序阅读 楼主  发表于: 2008-09-24
— 本帖被 XChinux 执行加亮操作(2008-09-25) —
现在写了个程序
在窗口Form1上有两个部件,一个QComboBox,一个QPushButton;
点击QPushButton将弹出窗口Form2,而Form2上有个QLineEdit部件。
此时,当程序运行后,想通过对Form1的QComboBox进行选择,从而触发Form2上的QLineEdit作出相应反映。
问题是,此时因为未点击QPushButton,故Form2并没有被new出来,更甭提那个QLineEdit部件。
想问应该怎样通过QComboBox来控制那个QLineEdit作出反映???
[ 此贴被rockyluo在2008-09-24 17:20重新编辑 ]
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线netlove

只看该作者 1楼 发表于: 2008-09-24
方法一,可以把两个窗口同时new出来,然后信号,槽
二,在第一个窗口中写一个接口,在2中获得
离线rockyluo

只看该作者 2楼 发表于: 2008-09-24
方法一倒是可以,可程序太大,真正程序中相互嵌套着几十个窗口,一层接一层,一下子全new出来不太现实。
敢问“在第一个窗口中写一个接口,在2中获得”
怎么讲?
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线netlove

只看该作者 3楼 发表于: 2008-09-24
窗口太多?我的程序就是启动的时候全部生成主要窗口的,要不然运行太慢了。
我也是不是很熟悉。不过可能像我这样的方法可能是笨的了,就是声明一个全局变量,然后,通过窗口1的公有函数得到你要的值,然后给窗口2.这个应该是用友元能实现吧。你也可以在点击BUTTON的时候,在槽函数里发出信号,通过这个信号给窗口2的,应该是很多方法实现的
离线rockyluo

只看该作者 4楼 发表于: 2008-09-24
根据你上面所讲的,希望一起探讨下下面几点:
1.  我们在设计一个较为复杂的界面(一层套一层)时,所有的窗口和部件是要在程序一开始运行的时候new出来,还是通过写成成员函数new出来?
    例:  Form1为主界面,上面有个QPushButton,点解QPushButton弹出Form2.  此时,生成Form2的代码是应该放在Form1的构造函数里呢?还是放在QPushButton的一个槽函数中?(我的界面跳转全部通过槽函数来实现的,在槽函数中new)
         
2.  复杂界面的页面跳转时,“前一个界面”是应该在“新界面”出现前“被hide( )掉呢”还是“被 delete掉”?(我好些都delete掉了,但有的也setEnabled( false )掉)

3.  对于此贴子问的那个问题,我想通过创建一个“间接文档”来实现,也就是说,Form1上的QComboBox初始化时从一个txt文件中读取值,当我对QComboBox进行选择后马上写入那个txt中;Form2中的QLineEdit则通过读取txt文件中的QComboBox的选择完成初始化。不知这种思路怎么样?

其他高人也一起讨论讨论。。。。。。。。
[ 此贴被rockyluo在2008-09-24 14:58重新编辑 ]
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线netlove

只看该作者 5楼 发表于: 2008-09-24
晚上回家继续讨论,正在忙工作,我也希望有高人指点
离线rockyluo

只看该作者 6楼 发表于: 2008-09-24
我的工作就是这个。。。。。。。。
好  等你晚上消息。。。
同时期盼  XChinux、浪漫天使 、破烂石头、suraid、water_wf 等等等等的以前帮过我的牛人以及其他各位牛人答复!
[ 此贴被rockyluo在2008-09-24 15:20重新编辑 ]
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线wangyang134
只看该作者 7楼 发表于: 2008-09-24
高手能不能给个简单点代码看看!
离线water_wf

只看该作者 8楼 发表于: 2008-09-24
我们在设计一个较为复杂的界面(一层套一层)???
在复杂的界面也的遵循设计规范,越复杂更需要简化设计,尽量采用统一的通信方法,比如signal/slos,嵌套只是parent->child-才有啊,怎么可能在QPushButton中呢,如果点击多次?不是还需要类成员来保存
实例化的指针吗?那还不如同意初始化呢!
离线sbtree
只看该作者 9楼 发表于: 2008-09-24
其实这个问题的本质就是如何获得目标窗口的指针,无论是使用信号和槽,还是接口函数,都要知道目标窗口的指针,只要获得了这个指针,无论做什么都是可能的了。
获取指针有几种方法
1.即时新建窗口获得指针
2.获取当前窗口的子窗口列表
3.利用自定义函数参数传递窗口指针
4.取得父窗口指针
。。。
可能还有其他方法,大家一起去挖掘吧
windows 7 + VC++2008 + Qt4.5.2
离线rockyluo

只看该作者 10楼 发表于: 2008-09-24
"在复杂的界面也的遵循设计规范,越复杂更需要简化设计"
***********water_wf 的意思就是说所有新界面都应该在Form1的构造函数里一起new出来?***************
在我程序里,Form1的QPushButton *b1 的connect为:
connect( b1,SIGNAL(clicked()),this,SLOT( ToForm2() ));  //  b1即为QPushButton产生的对象,为指针;
                                                    //  this为Form1,    ToForm2( )为Form1的成员函数
void Form1 :: ToForm2( )
{
        QWidget  *w =new QWidget(this);

        .......
        w->show( );
        b1->setEnabled(false);
}
这样,对于Form2中的任何部件只要在Form1的类定义中声明即可,再在ToForm2( )中new出来,
所以 不存在 “sbtree 大侠”说的“其实这个问题的本质就是如何获得目标窗口的指针”..............
此时,Form2的部件指针已经声明,只是在点击b1前并没有在内存中new出来。因此,对于Form1上的某个QComboBox而言,无法用信号/槽机制进行连接!
问题就在这儿!
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线water_wf

只看该作者 11楼 发表于: 2008-09-24
void Form1 :: ToForm2( )
{
        QWidget  *w =new QWidget(this);

        .......
        w->show( );
        b1->setEnabled(false);
}
如何多次点击呢?岂不是new多个?
离线sodwell

只看该作者 12楼 发表于: 2008-09-24
.....
离线rockyluo

只看该作者 13楼 发表于: 2008-09-24
老大  我已经把b1->setEnabled(false);掉了
况且新弹出的Form2会把Form1给遮盖掉
无法再点击b1咯

另外,我再在Form2里头添加个返回按钮,同样连接个槽成员函数,里头先把b1->setEnabled(true);  接着delete掉Form2的,这样就又回到了Form1
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线sbtree
只看该作者 14楼 发表于: 2008-09-24
引用第10楼rockyluo于2008-09-24 17:19发表的  :
......此时,Form2的部件指针已经声明,只是在点击b1前并没有在内存中new出来。因此,对于Form1上的某个QComboBox而言,无法用信号/槽机制进行连接!
问题就在这儿!

只是声明了指针,没有构建窗口,指针当然是无效指针了,也就是说,你先是自己杜撰了一个窗口指针而已,而目标窗口还不存在,没有实例化,却直接调用connect函数去强行连接,当然是不成功的,因为这个时候它根本还不知道把这个信号给谁呢,也就是说你使用了不当的方法试图获取一个根本还不存在窗口的指针。
windows 7 + VC++2008 + Qt4.5.2
离线rockyluo

只看该作者 15楼 发表于: 2008-09-24
sodwell  为啥改你帖子
刚看你的回复一眼  刷新成省略号了
你刚说的没错,我是必须点击按钮才弹出Form2来
用全局变量是可以实现  而且我也实现了

关键现在问题是,一个主界面,上面一个按钮,弹出新的一个界面,新界面上点击一个“返回按钮”,又返回主界面。
在此时,返回主界面后,那个刚弹出的新界面是应该被hide( )呢  还是应该被delete掉?
hide( )的话,占内存太多;  delete掉的话,控件立即被清除了,无法在其他界面调用。
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线rockyluo

只看该作者 16楼 发表于: 2008-09-24
引用第14楼sbtree于2008-09-24 17:48发表的  :
只是声明了指针,没有构建窗口,指针当然是无效指针了,也就是说,你先是自己杜撰了一个窗口指针而已,而目标窗口还不存在,没有实例化,却直接调用connect函数去强行连接,当然是不成功的,因为这个时候它根本还不知道把这个信号给谁呢,也就是说你使用了不当的方法试图获取一个根本还不存在窗口的指针。


就是说撒  这个理儿我也懂的
所以没有傻呼呼的连接那个只声明未实例化的指针
说来说去  搞得我自己都糊涂了  搞不清白自己都说些什么咯
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线sbtree
只看该作者 17楼 发表于: 2008-09-24
我的方法是,在Form2的构造函数中判断自己的父窗口是否为Form1,并取得Form1的指针,然后根据父窗口中的当前内容设置Form2中的QLineEdit,并使用connect函数连接父窗口的QComboBox的currentIndexChanged信号,和Form2中自定义的槽,更新Form2中的内容
[ 此贴被sbtree在2008-09-24 18:05重新编辑 ]
windows 7 + VC++2008 + Qt4.5.2
离线water_wf

只看该作者 18楼 发表于: 2008-09-24
QWizard QWizardPage
离线water_wf

只看该作者 19楼 发表于: 2008-09-24
delete掉的话,控件立即被清除了,无法在其他界面调用
谁负责new,谁负责delete
离线rockyluo

只看该作者 20楼 发表于: 2008-09-24
引用第19楼water_wf于2008-09-24 18:09发表的  :
delete掉的话,控件立即被清除了,无法在其他界面调用
谁负责new,谁负责delete



ToForm2( )来负责new  Form2     
Form2中会定义个按钮,按钮连接一个backToMain( )        // backToMain( )在Form1的类定义中声明
backToMain( )中负责delete掉Form2
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线water_wf

只看该作者 21楼 发表于: 2008-09-25
看看QWizard吧,做好的框架
离线codespy
只看该作者 22楼 发表于: 2008-09-26
为Form1定义一个Form2的指针pf2(初始为空)和一个槽form1Closed()。
在QPushButton触发的时候,判断pf2,为空就新建一个Form2,并连接此新建Form2的close信号到form1Closed()槽上。
同时在新建Form2时,还要连接Form2中Combox到这个Form2上。
然后就是显示Form2。
当Form2关闭的时候,调用Form2的form1Closed()。在form1Closed()中删除Form2,如果你希望关闭Form2的时候销毁这个对象。
我想这些就是楼主你想知道的。
[ 此贴被codespy在2008-09-26 19:53重新编辑 ]
离线stdjgwyc
只看该作者 23楼 发表于: 2008-12-16
引用第4楼rockyluo于2008-09-24 14:52发表的  :
根据你上面所讲的,希望一起探讨下下面几点:
1.  我们在设计一个较为复杂的界面(一层套一层)时,所有的窗口和部件是要在程序一开始运行的时候new出来,还是通过写成成员函数new出来?
    例:  Form1为主界面,上面有个QPushButton,点解QPushButton弹出Form2.  此时,生成Form2的代码是应该放在Form1的构造函数里呢?还是放在QPushButton的一个槽函数中?(我的界面跳转全部通过槽函数来实现的,在槽函数中new)
         
2.  复杂界面的页面跳转时,“前一个界面”是应该在“新界面”出现前“被hide( )掉呢”还是“被 delete掉”?(我好些都delete掉了,但有的也setEnabled( false )掉)
.......


你的主要意思我不知道有没有理解对。
你选择QCombox,参数可以在QPushButtonn的SLOT里获得,然后将这个参数传递给你要打开的form2,这样不可以吗?
即你定义form2的时候, 修改form2构造函数的参数为你想要的QComboBox的信息~
QT交流群群号:2906359,(200人大群,持续升级)
离线onglus
只看该作者 24楼 发表于: 2009-09-27
这个很简单的问题,你在QComboBox选择好你的选项完了之后,把这个选的内容转换成文本内容,然后,在你的from2对话框里面,QLabel *lineLabel=new QLabel();出来,之后,lineLabel->setText("这里的字符串就是你的QComoBox中可选的字符串")。这样,你的标签上就可以同步显示你在复选框中所选的选项内容了。希望我的提议对你会有帮助。
Qt高阶编程交流群71555992,进群条件是非常勿扰。
离线beajisong

只看该作者 25楼 发表于: 2009-09-27
第一,从人机交互层面上,我觉得你这个设计应该是不好的,这样互相交互估计没必要
第二,如果要做,可以再出现窗口时做信号和槽的连接,达到松耦合
离线tszy
只看该作者 26楼 发表于: 2009-10-07
Frame
顶上去!
小弟也有这个问题,在此聆听各牛人的讨论了。
Widget1中有控件pushButton1,Widget2 中有Label1,想点击pushButton1的时候改变Widget2上label1上的文字。但怎么也改变不了,经测试代码已经执行,但是空间上的字就是不变。开始以为是没有设置成Public类型的变量的问题,后来在widget2中写了改变label1的接口函数,但还是和以前一样,即使生命成public类型的也不能修改。真的很郁闷了……但是在widget2中写事件修改label1就成功,在别的widget就不能修改。望牛人指教!!

widget1中按钮事件

Frame1 *cFrame1;
void Buttons::on_pushButton_1_clicked()
{
    cFrame1 = new Frame1;
    cFrame1->setLabelext("123");
}

widget2中接口函数
void Frame1::setLabelText(QString strText)
{
    m_ui->label1->setText(strText);
    QMessageBox::warning(this,tr("1"),strText);//测试代码是否执行到此,测试结果对话框弹出,但是
//label文字没有被修改
}
离线hisong
只看该作者 27楼 发表于: 2010-09-28
赶上了讨论的末班车......
离线npuwj
只看该作者 28楼 发表于: 2011-04-08
回 9楼(sbtree) 的帖子
前辈,你好
请问下如何获得某一窗口的指针,能说得详细点吗,万谢谢了
离线sbtree
只看该作者 29楼 发表于: 2011-04-08
回 28楼(npuwj) 的帖子
通过函数传递窗口部件的指针是最直接的方法了
其他方法去google一下吧。

另注:前辈称呼不敢当。学有先后,达者为先。相互学习吧!
[ 此帖被sbtree在2011-04-08 23:33重新编辑 ]
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个