【问题标题】:Qt - widget - updateQt - 小部件 - 更新
【发布时间】:2015-05-29 05:12:52
【问题描述】:

我有一个带有按钮的小部件。我希望,每次单击按钮时,都应在小部件中添加一个标签。我在下面给出代码,但不工作。我不知道为什么。有人帮帮我吗?

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(";;;;;;;;;;;;;;");
 }

【问题讨论】:

  • 我在实际中尝试过。它有效。
  • @Max 正如 Fred 所说(下),在我调用 label->show() 之后,它工作正常。
  • 注意;如果要“嵌入”到另一个窗口中,则不需要调用 .show() 来使小部件出现。相反,请确保在实例化新小部件时将 Window 作为父参数添加。在没有父窗口小部件的情况下调用 .show() 将导致在新窗口中出现浮动窗口小部件。 (刚遇到同样的问题)

标签: c++ user-interface qt


【解决方案1】:

每次单击按钮时,EditThingsWindow 都会添加一个新的 QLabel。但是,由于标签没有放置在布局中,并且它们都以相同的文本移动到相同的位置(因此具有相同的大小),它们都出现在彼此的顶部,您只能看到最上面的那一个,这可能就是您认为没有添加它们的原因。

向 EditThingsWindow 小部件添加布局,并将每个新的 QLabel 添加到布局中,您将看到所有标签都出现了。

【讨论】:

  • 情况比你说的还要糟糕。根据您的说法,至少应该显示一个标签。但我没有看到任何标签。
  • @prabhkaran:尝试在 addbuttonClicked() 方法中调用 label->show()。如果未插入到布局中,新创建的小部件可能不会自动可见。
  • 你是对的。在我调用 label->show() 之后,它起作用了。谢谢你。
【解决方案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();
}

【讨论】:

  • 我想把标签放在任何我想要的地方。但是,如果我使用任何布局,那么,我必须失去那个选择。因为水平布局将小部件以水平方式放置,而垂直布局将小部件以垂直方式放置
  • @prabhakaran 然后,如果您不需要使用布局(很奇怪,因为您必须在每次表单位置/大小更改后处理每个控件的绝对位置)。布局灵活而强大,您应该学习它们。但。如果你想弄乱绝对位置,那么: label->move(10 + i* 30, 10), i = {1, 2, 3} :) 它可以工作:)
  • @prabhakaran 我修改了您的示例,它适用于绝对定位,但再次阅读布局,它们非常强大,并且没有(几乎 :))应用程序布局(抱歉)您不能与他们一起实现。
  • @prabhakaran:您可以使用 QTableLayout 或创建自己的。如果您使用绝对位置,则必须管理窗口大小调整或禁止调整大小。
猜你喜欢
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多