• 7529阅读
  • 11回复

迷惑!!!问一个基本的问题 [复制链接]

上一主题 下一主题
离线stdjgwyc
 
只看楼主 倒序阅读 楼主  发表于: 2008-12-06
— 本帖被 XChinux 执行加亮操作(2009-01-06) —
QT版本: QT4.3.3

QListWidget放在MainWindow的顶层,
将QListWidget的currentRowChanged()信号与一个slot连接了~~
在mainWindow中,我将QListWidget的行设置为了-1,
但是程序启动之后,也就是在mainWindow的show()函数执行完之后,QListWidget的当前行,
自动变为了-1!
但是,如果QListWidget不在顶层, (比如MainWindow上还有一个QTabWidget,QListWidget在QTabWidget上),这种情况下,程序运行之后, 当前行仍然为-1,不会变化。
为什么会发生这种情况??
是不是与show()函数相关?

第二个问题是,show()函数具体做了那些工作?
谢谢!
[ 此贴被stdjgwyc在2008-12-15 14:02重新编辑 ]
QT交流群群号:2906359,(200人大群,持续升级)
离线nmiirq

只看该作者 1楼 发表于: 2008-12-08
给点code看看吧,楼主,这样说很难明白你的意思的,毕竟每个人的表达和理解能力都是有限的~
离线stdjgwyc
只看该作者 2楼 发表于: 2008-12-08
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}
MyWidget是个QMainWindow,上面只有一个QListWidget和一个QPushButton两个控件

MyWidget::MyWidget(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
  connect(ui.pushButton,SIGNAL(clicked()),listWidget,SLOT(mySlot()));
  ui.listWidget->setCurrentRow(-1);  //设置QListWidget当前行 -1
}
MyWidget::mySlot()
{
//显示当前行数
QMessageBox::information(this,tr("curentRow"),QString("%1").arg(ui.listWidget->currentRow());
}

按照上面的代码,程序启动后,点pushButton(不对QListWidget做任何操作),弹出的消息框告诉当前行是0(而不为-1)!
现在,在designer中,再放置一个QGroupBox,然后将QlistWidget放到GroupBox中,(界面上总共三个控件),代码不做任何改动,重新编译,
运行程序,点pushButton(不对QListWidget做任何操作),
结果是: 弹出的消息框告诉当前行是-1。
我的问题是:
1、为什么会有这个差异? 当QListWidget是一个顶层窗口部件时,当前行自动由-1变为0;
2、main()函数中,widget.show() 这个show()函数具体执行了哪些操作?
QT交流群群号:2906359,(200人大群,持续升级)
离线stdjgwyc
只看该作者 3楼 发表于: 2008-12-08
这个好像是跟show()有关的,顶层窗口部件,如QListWidget和QTreeWidget,在show()函数执行时,会自动搜寻第一个item? 然后就设置当前行为0了 么?

请大家帮忙
QT交流群群号:2906359,(200人大群,持续升级)
离线stdjgwyc
只看该作者 4楼 发表于: 2008-12-09
顶起,
大家帮忙看看
QT交流群群号:2906359,(200人大群,持续升级)
离线stdjgwyc
只看该作者 5楼 发表于: 2008-12-09
沉的好快
QT交流群群号:2906359,(200人大群,持续升级)
离线stdjgwyc
只看该作者 6楼 发表于: 2008-12-10
好久了,没人肯吭下声………………
QT交流群群号:2906359,(200人大群,持续升级)
离线stdjgwyc
只看该作者 7楼 发表于: 2008-12-11
好奇怪, 大家都没有碰到过这个问题吗
怎么都没有一个人愿意看看,试验一下呢
QT交流群群号:2906359,(200人大群,持续升级)
离线water_wf

只看该作者 8楼 发表于: 2008-12-11
这个不清楚为什么这样
1: 但是一般通过currentIndex().isValid() 来判断是否有item被选中
2: show就是把这个窗口显示出来
离线stdjgwyc
只看该作者 9楼 发表于: 2008-12-11
1\  出现此问题的有QTreeWidget和QListWidget,
但是,QTreeWidgetItem和QListWidgetItem都没有isValid()这个函数(在QT4.3.3中)。
针对QListWidget,是通过currentRow()来判断的~~  但因为这个问题的存在,并不能区分程序刚启动的时候,是人为的鼠标点击产生的currentRow的改变,或是程序自动的改变,
因此,这个问题,在currentRowChanged()信号与 自定义的slot()相连接的时候,如果忽略了这个问题,那么程序就变得毫无健壮性了~~~
2、QT mailList里有人说show()会自动搜索QListWidget的第一个item, 但是我不明白,既然搜索第一个item,为什么当QListWidget不在顶层的时候,就不搜索了,这个搜索是“有条件的”搜素吗?所以想了解更多的内容~

谢谢~~~       
希望这个问题能吸引更多的人加入讨论~~~~~
 
QT交流群群号:2906359,(200人大群,持续升级)
离线lj_0212

只看该作者 10楼 发表于: 2008-12-12
在vs2005里照这个意思写了一下,结果都是0.

qt的库是4.4.2的。从源代码编译的。
离线stdjgwyc
只看该作者 11楼 发表于: 2008-12-15
我想这个跟编译器应该没有什么关系。

可能与版本相关吧?

我的版本是 QT 4.3.3

希望有QT4.3.3或更低版本的帮忙测试一下~~~~~~~~~~~~

继续关注
QT交流群群号:2906359,(200人大群,持续升级)
快速回复
限100 字节
 
上一个 下一个