LINUX.ORG.RU

Сообщения chehov

 

Повторный вызов или создание окна

Разрабатывается оконное приложение на QT5, которое работает на raspberry PI в консольном режиме.

По определенному событию необходимо вывести на экран форму, по определенному событию её же нужно убрать. Я вижу два варианта решения этой проблемы:

1. Единожды создать объект, после чего методами show и hide выводить и убирать окно.

2. Постоянно создавать и уничтожать объект.

Если идти по первому пути, сталкиваюсь со следующей проблемой: по методу show окно выводится на экран, по вызову метода hide (по вызову метода close, кстати, тоже) окно перестает функционировать (это видно по расположенному на нем таймеру), но не пропадает с экрана. При повторном вызове show окно начинает нормально функционировать.

main.cpp

ServiceWindow *my = new ServiceWindow(a.desktop());

Delegate *myDelegate = new Delegate();

QObject::connect(myDelegate, SIGNAL(haveOperator(int)), my, SLOT(show()));
QObject::connect(myDelegate, SIGNAL(dontHaveOperator(bool)), my, SLOT(hide()));

servicewindow.h

namespace Ui {
class ServiceWindow;
}

class ServiceWindow : public QWidget
{
    Q_OBJECT

public:
    explicit ServiceWindow(QWidget *parent = 0);
    ~ServiceWindow();

public slots:

protected:
    void closeEvent(QCloseEvent *event);
    void showEvent(QShowEvent *event);
//    bool event(QEvent *myEvent);

private slots:
    void timeIter();

private:
    Ui::ServiceWindow *ui;
    QTime mytime;
    QTime mytime_s;
    QTimer *time1;
};

servicewindow.cpp

ServiceWindow::ServiceWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ServiceWindow)
{
    ui->setupUi(this);

    time1 = new QTimer();
    time1->setInterval(1000);
    connect(time1, SIGNAL(timeout()), this, SLOT(timeIter()));

}

ServiceWindow::~ServiceWindow()
{
    delete ui;
}


void ServiceWindow::timeIter() {
    mytime_s = mytime_s.addSecs(1);
    ui->labelTimer->setText(mytime_s.toString());
    time1->start();
}

void ServiceWindow::closeEvent(QCloseEvent *event){
    qDebug() << "Помолясь, начнем";
    mytime_s.setHMS(0, 0, 0);
    ui->labelTimer->setText(mytime_s.toString());
    time1->stop();
    this->clearMask();
    event->accept();
    qDebug() << this->isHidden();
}

void ServiceWindow::showEvent(QShowEvent *event){
    time1->start();
    mytime = QTime::currentTime();
    mytime_s.setHMS(0, 0, 0);
    event->accept();

    ui->labelStart->setText(mytime.toString());
}

Если идти вторым путем, то после уничтожения объекта окно исчезает, но при повторном создании объекта происходит следующее: создается новый экземпляр класса, но форма на экран не выводится.

main.cpp

Delegate *myDelegate = new Delegate();

QObject::connect(myDelegate, SIGNAL(haveOperator(int)), myDelegate, SLOT(serviceMonitorShow()));
QObject::connect(myDelegate, SIGNAL(dontHaveOperator(bool)), myDelegate, SLOT(serviceMonitorHide()));

Слоты serviceMonitorShow() и serviceMonitorHide().

void Delegate::serviceWindowShow(){
    qDebug() << myServiceWindow;
    if(myServiceWindow == 0) myServiceWindow = new ServiceWindow();
    myServiceWindow->show();
    qDebug() << myServiceWindow->isEnabled() << myServiceWindow->isVisible();
}

void Delegate::serviceWindowHide(){
    myServiceWindow->close();
    delete myServiceWindow;
    myServiceWindow = 0;
}

В какую сторону копать?

 , , ,

chehov
()

RSS подписка на новые темы