2010-09-01 101 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