• 6597阅读
  • 2回复

[提问]将书中源码spreadsheet修改为多文档界面时出现令人费解的问题 [复制链接]

上一主题 下一主题
离线heghost
 
只看楼主 倒序阅读 楼主  发表于: 2013-08-24
书中给出了实现spreadsheet的源码,但书中对spreadsheet实现多文档界面的描述似乎过于简单,在csdn看到对spreadsheet的功能进行拓展的代码(实现了多文档界面,加入了redo和undo操作)。在spreadsheet源码的spreadsheet的构造函数中,使用了这样一种方式:
Spreadsheet::Spreadsheet(QWidget *parent): QTableWidget(parent)
{
  //代码省略,通过调用  setRowCount(RowCount)和 setColumnCount(ColumnCount)设置行数和列数,
    //其中RowCount和ColumnCount都是枚举常量
}
为了能够指定表的行数和列数,我将spreadsheet的构造函数改成这样:
Spreadsheet::Spreadsheet(int row, int col, QWidget *parent)   : QTableWidget(row, col, parent)
{
}
也就是在创建表的时候指定行数和列数。
这样修改后运行程序,发现工具栏中剪切、复制、删除都处于非激活状态,如附件图片所示。最小化程序,然后再恢复窗口后就处于激活状态了。这种问题就非常诡异了,一直没想通.............

单步跟踪发现:
单击最小化和然后再恢复窗口时,通过connect(mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(updateActions(QMdiSubWindow*)));
进入updateActions函数
void MainWindow::updateActions(QMdiSubWindow *subWindow){  
     Spreadsheet *sp = activeSpreadsheet();    
     bool hasSpreadsheet = sp;  
     bool hasSelection = hasSpreadsheet && !sp->selectedRanges().isEmpty();  
     bool hasTextOnClipboard = !(QApplication::clipboard()->text().isEmpty());  
     saveAction->setEnabled(hasSpreadsheet);    saveAsAction->setEnabled(hasSpreadsheet);  
     cutAction->setEnabled(hasSelection);
      //部分代码省略
}
sp指空,导致工具栏不激活。这种问题在Spreadsheet的构造函数使用前面叙述的第一种方法时就不会出现。

补充:activeSpreadsheet()函数定义如下:
Spreadsheet* MainWindow::activeSpreadsheet(){  
     QMdiSubWindow *subWindow = mdiArea->activeSubWindow();  
     if (subWindow)  
           return qobject_cast<Spreadsheet *>(subWindow->widget());
     return 0;}

离线heghost
只看该作者 1楼 发表于: 2013-09-05
已解决!
离线yfx2003

只看该作者 2楼 发表于: 2013-09-12
貌似你上面的代码中的update有些逻辑问题?

求你的正解


应该说一声嘛,造福后继者,谢谢
www.qtcn.org/gpq4/
ajaxref.okajax.com/
快速回复
限100 字节
 
上一个 下一个