2011-07-15 31 views
0

在我目前正在使用的函數中,我創建了一個複選框的多維數組,其維數由用戶在運行時指定。爲了表示'z'維,我創建了多個選項卡 - 每個選項卡代表不同的維度 - 並在每個選項卡中創建一個複選框數組。這些標籤被標記爲dim1,dim2,dim3,...等。如何使用變量名訪問QTabWidget類的成員選項卡?

我遇到的問題是,爲了創建複選框(在'循環中3'的數組)的事實,我必須打電話給標籤如下:

checkBoxVector.append(new QCheckBox(ui->dim1)); 

其中checkBoxVector保存指向複選框的指針。現在我的第一個想法是,我會簡單地創建一個變量名稱,每個循環都會改變。每次迭代,它都會變成:「dim1」,然後是「dim2」,「dim3」......等等。問題在於我不能使用字符串變量來引用選項卡,我必須鍵入實際的名稱該標籤。下面是一個代碼示例:

int num = k+1; 
QString dim = "dim"; 
QString tab_name = dim.append(QString("%1").arg(num)); 
checkBoxVector.append(new QCheckBox(ui->tab_name)); 

這給我的錯誤「‘類UI ::主窗口’沒有名爲‘TAB_NAME’成員」。

因此;我的問題是:我怎麼能應用這個想法改變每個循環的選項卡的名稱,而不會造成這樣的錯誤?

編輯:我想我忘了提及這個標籤已經被創建,並且已經被標記爲「dim1」,「dim2」,「dim3」......名稱。我遇到的唯一問題是如何在創建這些選項卡後引用這些選項卡。我覺得有一個簡單的語法解決方案。

+0

是否有其他建議?我真正需要的是能夠迭代QTabWidget成員的名稱。 –

+0

標籤是如何創建的?向我們展示一些代碼。 – TonyK

回答

0

存放在數組和索引它與您用於遍歷您的複選框的多維數組的第三維變量的指針選項卡,您的代碼會是這個樣子:

QTabWidget* tabs[3]; 
tabs[0] = ui->dim1; 
tabs[1] = ui->dim2; 
tabs[2] = ui->dim3; 

// ... and then 

checkBoxVector.append(new QCheckBox(tabs[z])); 
+0

我不認爲這解決了我的問題。這是存儲標籤的乾淨方式,但我仍然無法在此處遍歷標籤的名稱。請記住,我有一個未知的標籤數量,所以我仍然不得不求助於使用我的'ui-> tab_name'解決方案(這不起作用)。 –

0

有人會說更好(有一個概念名稱),但你不能動態地聲明C++中的成員......如果你想QString tab_name內容以任何方式與這部分代碼中的ui的成員有關:

QString tab_name = dim.append(QString("%1").arg(num)); 
checkBoxVector.append(new QCheckBox(ui->tab_name)); 

編譯器需要在編譯時瞭解女巫會員ui它會用來找到新的QCheckBox的父親。

糾正我,如果我錯了,你有dimz選項卡和dimy*dimxQcheckBox在每個選項卡。當你建立你ui文件時,你不知道任何dim*

因此,創建您自己的小部件(QWidget)它將存儲一個QcheckBox*的數組,您可以在構造函數中動態創建例如。該小部件將負責正確佈局複選框。

然後最後你創建你自己的QTabWidget這將創建dimz你的部件的標籤。您將使用與其z座標相對應的索引訪問您的選項卡。

+0

有了這個解決方案,它將解決讓複選框正確佈局的問題;然而,我是否也必須創建一個新的數組(至少是另一個checkBoxVector維度)來保存複選框?我的意思是我需要能夠在代碼中訪問每個複選框的狀態,並且如果我只是從同一個小部件中複製z次相同的數組,我需要創建一個新的檢查數組不管我是否希望能夠訪問它們,每個選項卡都有相應的框。所以我回到了當前代碼中的同一點。 –

+0

不要說將數據與'ui'分開並不是一個更好的選擇,但是您可以輕鬆創建一個方便的訪問器,在您的選項卡小部件中將其命名爲QCheckBox * getCheckBox(int x,int y,int z) 'dimx + y * dimy' QCheckBox的索引爲'z'的選項卡... – vrince

+0

事情是我已經在代碼的早期創建了選項卡,唯一真正的問題是我只是試圖引用他們的名字使用我的'for'循環。我覺得我缺少一個簡單的語法解決方案。對不起,我編輯了我的問題以提供更多信息,因爲我想我忘了提及它! –

0

你試圖引用不存在的成員變量:

int num = k+1; 
QString dim = "dim"; 
QString tab_name = dim.append(QString("%1").arg(num)); 
checkBoxVector.append(new QCheckBox(ui->tab_name)); 

錯誤是由要傳遞一個不存在的成員變量QCheckBox的構造造成的事實。 ui指針指向的對象沒有名爲tab_name的成員變量。如果我正確地理解了你的描述,只需將局部變量tab_name傳遞給QCheckBox構造函數,如下所示:

checkBoxVector.append(new QCheckBox(tab_name)); 
+0

該解決方案使每個複選框都在其自己的單獨窗口中創建,旁邊有一個標籤,用於讀取tab_name變量中保存的任何內容。所以說我創建了一個2 * 3 * 2複選框的數組,它只彈出了12個窗口,每個窗口都有一個複選框。 –