找回密码
 立即注册
收起左侧

关于从mainwindow跳到dialog堆栈窗口对应页

8
回复
9577
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2018-3-2 18:18:12 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 Zohan 于 2018-3-7 09:41 编辑


如图,在这个dialog中可以通过点击左边ListWidget的项来让右边的StackedWidget显示不同页,这步已实现

现在在mainwindow中有3个按钮,我想实现点不同按钮就打开dialog中的对应页,应该如何编写?

我现在的做法是,自定义信号和槽,点击mainwindow中的按钮就发送带int参数的信号,然后由dialog中的槽接收这个int,根据int来设置List的被选中项或Widget页

但是从mainwindow中打开dialog后,它始终是显示第一页,比如我点按钮2或3,打开的dialog还是在窗口1页面.....在这之后依然可以在dialog通过点击左边来切换右边的页面

我用qDebug()看了,dialog中槽接收到了来自mainwindow的信号,把list的row设成我传过去的值,但之后又自动设为0(也就是选中第一项)

dialog中有两个槽,一个是实现它本身的list和stacked的绑定显示,另一个是接收mainwindow传过去的值来设置list,不知道为什么会冲突,或者说进到dialog后它会自动执行第一个槽


比如下面这是按钮2的槽(dialog就是上图的methodAnaly),感觉在show完dialog后再设置list的被选中项应该就行了啊,但它会自己切回0...
int p = 1;
dialog mP;
mP.show()
emit setDialogPage(p);
mP.exec();


刚开始自学基础不扎实,有哪里出错了,还望求大佬解答!(源码见附件)
附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

这个问题是因为 on_listWidget_currentRowChanged 这个槽函数在界面加载完毕之后会立马触发一次, currentIndex 会从 -1 变为 0,所以有一次函数的调用,你把 主界面上的 Index 传到 dialog ,然后在 on_listWidget_currentRowChanged 这个函数里面 做这样一个判断 if(currentRow == this->currentIndex) { ui->stackedWidget->setCurrentIndex(currentRow); ui->listWidget->setCurrentRow(currentRow); ...
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2018-3-2 18:18:13 显示全部楼层
这个问题是因为 on_listWidget_currentRowChanged 这个槽函数在界面加载完毕之后会立马触发一次, currentIndex 会从 -1 变为 0,所以有一次函数的调用,你把 主界面上的 Index 传到 dialog ,然后在 on_listWidget_currentRowChanged 这个函数里面 做这样一个判断
    if(currentRow == this->currentIndex)
    {
        ui->stackedWidget->setCurrentIndex(currentRow);
        ui->listWidget->setCurrentRow(currentRow);
    }
    else
    {
        ui->stackedWidget->setCurrentIndex(this->currentIndex);
        ui->listWidget->setCurrentRow(this->currentIndex);
    }

this-> currentIndex 就是在dialog 构造函数里面接收的来自 mainwindow 的 index 参数
Dialog:: Dialog(QWidget *parent, int index) :
    QDialog(parent),
    ui(new Ui:: Dialog),currentIndex(index)
{
    ui->setupUi(this);
}

如此这个问题就可以得到解决
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2018-3-4 13:56:29 显示全部楼层
代码可以发一下,这个问题不大,但是描述起来可能有点麻烦,有空可以帮你看一下, 874823787@qq.com
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2018-3-5 00:06:37 显示全部楼层
Since 发表于 2018-3-4 13:56
代码可以发一下,这个问题不大,但是描述起来可能有点麻烦,有空可以帮你看一下,   ...

先谢谢大佬了!已发邮箱,有时间再看就好
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2018-3-6 23:27:53 显示全部楼层
Since 发表于 2018-3-2 18:18
这个问题是因为 on_listWidget_currentRowChanged 这个槽函数在界面加载完毕之后会立马触发一次, currentI ...

谢谢指点!学习到了!
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2018-3-6 23:42:15 显示全部楼层
Since 发表于 2018-3-2 18:18
这个问题是因为 on_listWidget_currentRowChanged 这个槽函数在界面加载完毕之后会立马触发一次, currentI ...

大佬!等一下,别走!刚没发觉,突然发现这样改的话,虽然能从mainwindow到对应的dialog页了,但是进入dialog页无法再继续换别的页了,只能从mainwindow中选

点评

你看看是不是判断语句写反了,我试过是可以改变的,但是这个代码我则么觉着是反的呢!【笑哭】  详情 回复 发表于 2018-3-7 08:42
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2018-3-7 08:42:01 显示全部楼层
Zohan 发表于 2018-3-6 23:42
大佬!等一下,别走!刚没发觉,突然发现这样改的话,虽然能从mainwindow到对应的dialog页了,但是进入di ...

你看看是不是判断语句写反了,我试过是可以改变的,但是这个代码我则么觉着是反的呢!【笑哭】
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2018-3-7 09:35:56 显示全部楼层
Since 发表于 2018-3-7 08:42
你看看是不是判断语句写反了,我试过是可以改变的,但是这个代码我则么觉着是反的呢!【笑哭】 ...

if和else的反过来?也不行TAT...
现在不反过来打开dialog后再去选,它还是执行on_listWidget_currentRowChanged,但是里面的if/else就限定了它只会把页面按mainwindow中传进来的index来设置啊,它自己无法变化了
反过来的话,那它就在dialog中可选,但mainwindow传来的index就没用了
我主要是想实现一个查看说明书、用例文档的功能,就像Qt Creator自身不是可以打开内部库类、函数之类的说明页吗
是不是要自定义两个槽函数来分别处理
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2018-3-7 09:41:46 显示全部楼层
加我吧,  874823787@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了