动态添加小部件

时间:2015-12-24 12:18:49

标签: c++ qt

我想打开一个主窗口,然后在运行时稍后添加一些按钮。

编辑:我更新我的代码以考虑PRIME的答案(并且可能使问题更精确)

我写了这个:

' ex_qt.h'

#include<QHBoxLayout>
#include<QMainWindow>

class ButtonWindow : public QMainWindow
{
    Q_OBJECT;

    signals:
        void need_button();
    private slots:
        void start_loop();
        void do_bing();
        void create_button();
    private:
        QVBoxLayout* v_layout;
    public:
        ButtonWindow();
};

和&#39; ex_qt.cpp&#39;

#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <QtGui>
#include "ex_qt.h"
void ButtonWindow::start_loop()
{
    for (int i=0;i<10;i++)
    {
        std::chrono::milliseconds timespan(500);
        std::this_thread::sleep_for(timespan);
        emit need_button();
    }
}

void ButtonWindow::create_button()
{
    std::cout<<"Creating a new button"<<std::endl;
    QPushButton* button= new QPushButton("auto");
    v_layout->addWidget(button);
    button->show();
}

void ButtonWindow::do_bing() { std::cout<<"BING"<<std::endl; }

ButtonWindow::ButtonWindow():
    QMainWindow()
{
    QWidget* button_widget = new QWidget(this);
    v_layout=new QVBoxLayout();

    QPushButton* button= new QPushButton("click here to begin");
    QPushButton* button2= new QPushButton("make bing");
    v_layout->addWidget(button);
    v_layout->addWidget(button2);

    button_widget->setLayout(v_layout);

    connect( button,SIGNAL( clicked()  ),this, SLOT(start_loop()) );
    connect( button2,SIGNAL( clicked()  ),this, SLOT(do_bing()) );
    connect( this,SIGNAL( need_button()  ),this, SLOT(create_button()) );
    setCentralWidget(button_widget);
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ButtonWindow* bw=new ButtonWindow();
    bw->show();
    app.exec();
    return 42;
}

使用此代码,单击&#34;单击此处以显示begnin&#34;,我看到主窗口放大10倍,但按钮仅在结尾处可见。同样的事情&#34; bing&#34;按钮:如果我在循环循环时点击bing按钮,那么&#34; BING&#34;仅在循环结束时显示。

我的目标是立即使用全功能按钮,即使还没有创建下一个按钮。

我如何实现目标?

2 个答案:

答案 0 :(得分:0)

实际上这个程序需要多项改进,

但是刚开始:

完全删除启动功能。 然后将主要内容更改为:

 int main(int argc, char *argv[])
{
        QApplication app(argc, argv);
        MainWindows* mw=new MainWindows();
        mw->show();
        app.exec();
}

这将确保您的窗口正确启动并在事件循环中运行。 除了在一段时间后添加窗口之外,在MainWindow类中使用一个计时器对象,以便在时间间隔之后它可以给你一个信号,到该信号的插槽(newButton可以是那个函数/插槽)您可以将小部件添加到布局中。

此外,由于您需要主窗口,请从QMainWindow派生您的类,使用初始化列表初始化您的变量。

你的程序是否也在类声明中使用类似的东西进行编译?

QHBoxLayout* main_layout=new QHBoxLayout; 

答案 1 :(得分:0)

答案是processEvents功能。 只需添加

qApp->processEvents();

之后

emit need_button();

一切似乎都很好。