2010-09-01 69 views
1

我有一個按鈕的小部件。我想,每按一下按鈕,一個標籤應該被添加到小部件中。我給出下面的代碼,但不起作用。我不知道爲什麼。來人幫幫我?Qt - 小部件 - 更新

class EditThingsWindow:public QWidget 
{ 
    Q_OBJECT 

    QPushButton * add; 

public: 
    EditThingsWindow(); 

public slots: 
    void addButtonClicked(); 
}; 

EditThingsWindow::EditThingsWindow():QWidget() 
{ 
    QWidget* wid = this; 
    wid->resize(400,400); 

    add=new QPushButton(wid); 
    add->setText("Add"); 
    add->move(20,10); 
    line=new QLineEdit(wid); 
    line->move(30,50); 

    QObject::connect(add,SIGNAL(clicked()),this,SLOT(addButtonClicked())); 
} 

void EditThingsWindow::addButtonClicked() 
{ 
    QLabel* label = new QLabel(this); 
    label->move(200,160); 
    label->setText(";;;;;;;;;;;;;;"); 
} 
+0

我嘗試了它的行動。有用。 – 2010-09-01 14:43:22

+0

@Max 正如Fred所說(下面),在我調用label-> show()之後,它工作正常。 – prabhakaran 2010-09-01 17:21:04

+0

注意;如果要在另一個窗口中「嵌入」,則不需要調用.show()來顯示該窗口小部件。相反,確保在實例化新小部件時將您的Window添加爲父參數。調用.show()而沒有父窗口小部件將導致在新窗口中浮動窗口小部件。 (剛纔有同樣的問題) – 2012-01-25 12:28:00

回答

5

每次單擊按鈕時,新的QLabel確實會添加到EditThingsWindow中。但是,由於標籤沒有放置在佈局中,並且它們都以相同的文本(因此具有相同的大小)移動到相同的位置,所以它們都顯示在彼此之上,並且只能看到最上面的一個,這可能是你認爲他們沒有被添加的原因。

向EditThingsWindow小部件添加一個佈局,並將每個新的QLabel添加到佈局,您將看到所有標籤出現。

+0

這種情況比你說的要糟糕。根據你至少應該顯示一個標籤。但我沒有看到任何標籤。 – prabhakaran 2010-09-01 14:30:35

+2

@prabhkaran:嘗試在addbuttonClicked()方法中調用label-> show()。如果未插入佈局,新創建的小部件可能不會自動顯示。 – Fred 2010-09-01 14:37:38

+0

你是對的。在我調用label-> show()之後,它起作用了。謝謝你,兄弟。 – prabhakaran 2010-09-01 17:19:53

2

只需添加布局並將新生兒標籤放入其中即可。

QHBoxLayout *layout = new QHBoxLayout; // or some another QLayout descendant 
layout->addWidget(newWidget); 

widget->setLayout(layout); 

我不得不改變的唯一的地方就是添加布局到窗口小部件,然後

void EditThingsWindow::addButtonClicked() 
{ 
    QLabel * label=new QLabel(this); 
    layout->addWidget(label); 
    label->move(200,160); 
    label->setText(";;;;;;;;;;;;;;"); 
} 

得到了做的事情。

如果你必須(你不要!)搞砸絕對定位,你應該自己做所有這些樣板代碼。標題和內容略。

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    EditThingsWindow w(0); 
    w.show(); 
    return a.exec(); 
} 

EditThingsWindow::EditThingsWindow(QWidget *parent):QWidget(parent) 
{ 
i = 0; 
setGeometry(2, 2, 400, 400); 
add=new QPushButton(this); 
add->setGeometry(2, 2, 100, 20); 
add->setText("Add"); 
add->move(20,10); 

QObject::connect(add,SIGNAL(clicked()),this,SLOT(addButtonClicked())); 
} 

void EditThingsWindow::addButtonClicked() 
{ 
QLabel * label=new QLabel(this); 
label->setGeometry(10, 30 + i* 30, 50, 20); 
i++; 
label->setText(";;;;;;;;;;;;;;"); 
label->show(); 
} 
+0

我想把標籤放在任何我想要的地方。但是,如果我使用任何佈局,那麼我必須失去這種選擇。因爲水平佈局會以水平方式放置小部件,並且垂直佈局會以垂直方式放置小部件 – prabhakaran 2010-09-01 14:32:38

+1

@prabhakaran然後,如果您不需要使用佈局(很奇怪,因爲您必須在每個表單位置之後處理每個控件的絕對位置/尺寸改變)。佈局靈活而強大,你應該學習它們。 但是。如果你想陷入絕對pos,那麼:label-> move(10 + i * 30,10),i = {1,2,3} :)它的工作:) – 2010-09-01 14:53:43

+0

@prabhakaran我修改了你的例子,它的工作原理絕對定位,但再次閱讀有關佈局,他們是非常強大的,沒有(幾乎:))應用程序佈局(對不起),你不能與他們實現。 – 2010-09-01 15:21:42