2015-12-24 2 views
-1

Я бы хотел открыть основные окна, а затем добавить несколько кнопок внутри позже во время выполнения.добавить виджет «на лету»

EDIT: Я обновить свой код, чтобы принять во внимание ответ 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(); 
}; 

и 'ex_qt.cpp'

#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; 
} 

С помощью этого кода при нажатии «нажмите здесь, чтобы попросить», я вижу, что главное окно увеличивается в 10 раз, но кнопки только становятся видимыми в конце. То же самое с кнопкой «bing»: если я нажимаю кнопку bing во время цикла, цикл «BING» отображается только при завершении цикла.

Моя цель - немедленные функциональные кнопки, даже если следующая кнопка еще не создана.

Как я могу достичь своей цели?

ответ

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

Да, он компилируется с "-std = C++ 11". Я приспосабливаю свой код к вашему комментарию. Благодарю. –

0

Ответ был processEvents. Просто добавьте

qApp->processEvents(); 

после

emit need_button(); 

и все, кажется, работает хорошо.

Смежные вопросы