我想打开一个主窗口,然后在运行时稍后添加一些按钮。
编辑:我更新我的代码以考虑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;仅在循环结束时显示。
我的目标是立即使用全功能按钮,即使还没有创建下一个按钮。
我如何实现目标?
答案 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)