2012-05-24 55 views
0

我以爲我開始明白這一點,但似乎沒有。無法連接到家長插槽

我正在嘗試將堆疊的小部件連接在一起,以便孩子可以向父母發送消息以告知其更改視圖。 QStackedWidget是主窗口的子項,它的頁面是我自己創建的促銷項目。我認爲這是正確的做法嗎?

左右的時間內一個孩子形成我試過如下:

// Set up a mapping between the buttons and the pages 
QSignalMapper *mapper = new QSignalMapper(this); 

mapper->setMapping(ui->automatedButton, 1); // Value of the index 
connect(ui->automatedButton, SIGNAL(clicked()), mapper, SLOT(map())); 

connect(mapper, SIGNAL(mapped(int)), ((QStackedWidget*)parentWidget()), SLOT(setCurrentIndex(int))); 

但是,這似乎並沒有工作。我點擊按鈕,沒有任何變化。但是,如果我這樣做:

void MySelectionForm::on_automatedButton_clicked() 
{ 
    ((QStackedWidget*)parentWidget())->setCurrentIndex(1); 
} 

我以爲和我以前做的一樣嗎?

QObject::connect: Cannot connect QSignalMapper::mapped(int) to (null)::setCurrentIndex(int) 

回答

3

是否檢查parentItem()沒有返回NULL當你調用QObject::connect()

我上運行的消息,我猜是相關時,看到了嗎?這聽起來像也許父項構造函數,這將意味着parentItem()確實會返回NULL。我懷疑這可能是Qt Designer的推出方式。如果是這樣,你需要在構造函數之外連接信號/插槽,或者使用另一個方法(不在構造函數內部調用的方法),或者完全在孩子的外部。

+0

啊,這是非常有用的。我將表單從設計器中移出,並在MainWindow構造函數中手動添加它們,將父項設置爲堆疊容器,現在按預期方式工作。可能還有另外一種方法可以通過設計師來完成,但現在可以直到我解決問題,所以謝謝! – Firedragon

1

根據該消息,

((QStackedWidget*)parentWidget()), SLOT(setCurrentIndex(int))); 

導致

(null)::setCurrentIndex(int) 

這意味着parentWidget()NULL

這基本上意味着表格不是QStackedWidget的孩子。 如果你手動創建你的表單,你必須這樣做

MyForm *form = new MyForm(ui->stackedWidget); 
+0

我沒有手動完成它們,雖然我的意思是他們會沒事的,但可能是因爲我是如何創建它們的。在框架中花更多時間,這可能很容易。我按照你提到的手動創建了它們,而且確實有效。 – Firedragon