2013-03-05 22 views
0

我有兩個問題: 第一個問題很簡單 - 我有一個按鈕列表。我希望當他們中的一個被點擊從列表中刪除,然後動態分配的按鈕被刪除。這是插槽我寫的代碼(沒有在代碼中的一些額外的信息):Qt獲取信號調用者並按行從文件行中讀取

void Window :: bla2() 
{ 
    //I fond somewhere on the internet that apperantly "sender()" should return a pointer to the caller; 
    for(int i = 0; i < List.size(); i++) 
    { 
     if(List[i] == sender()) 
     { 
      List.removeOne(sender()); 
     } 
    } 
    delete sender(); 

} 

好了,現在我的第二個問題,我想讀一行文本文件中的行每行加作爲註釋向量的一個元素,這是一個派生類的.cpp文件,它充當一個窗口,所以在頭部分中已經定義了一切。

vtext = new QFile("one.txt"); // QFile variable 
    while (vtext->atEnd() == false) 
    { 
     line = vtext->readLine(); //QString 
      quotes.push_back(line);//quote is QVector<QString> 
    } 
+0

不要在一篇文章中提出多個問題。你應該提出兩個不同的問題。 – 2013-03-05 16:30:42

回答

2

要回答你的第一個問題:

不允許你在一個由Qt的那個對象稱爲插槽刪除對象。這是有原因的,因爲您可能會將其他事件發佈到對象或其他插槽中,這些事件將被稱爲對當前事件的反應,這些事件會期望找到有效的對象。考慮到按鈕點擊信號連接到多個插槽的情況,如果第一個插槽刪除發送者,我們處於未定義的行爲區域。 Qt爲此提供了deleteLater()deleteLater()推遲刪除對象,直到程序再次進入其事件循環。多次調用刪除也是安全的。

delete Sender()更改您的代碼Sender()->deleteLater();

如果你的列表QWidgets而非QObject對象,你需要投發件人(的結果),以一個QWidget。如果您絕對確信此插槽只能從QWidget中調用,那麼您可以繼續使用static_cast<QWidget*>(Sender()),但我強烈建議通過調用Sender()->isWidgetType()來首先測試QObject是否爲QWidget,如果發送者實際上返回true一個小工具。

至於你的第二個問題,我看起來應該做你的想法,我看不出真正的問題。在StackOverflow上,最好每次問一個問題。我會建議編輯這個問題,並拿出下半部分,並將其作爲一個新問題發佈。它也是一個很好的做法,可以給出一個簡短的例子,其他人可以編譯和測試。

+0

感謝您的意見。但這並不能解決問題。我在下面一行中遇到語法錯誤: List.removeOne(sender()); 以下錯誤消息 C:\ Users \ SameTime \ Desktop \ Cutie \ ToDo2 \ Window.cpp:21:error:C2664:'QList :: removeOne':無法將參數1從'QObject *'轉換爲' QWidget的* const的&」 與 [ T = QWidget的* ] 原因:不能從轉換 '的QObject *' 到 'QWidget的* const的' 指向的類型無關;轉換需要reinterpret_cast,C風格轉換或函數風格轉換 – Bloodcount 2013-03-05 17:55:28

+0

這就是爲什麼它發佈整個代碼的重要性;) – odinthenerd 2013-03-05 18:06:27