Разрабатывается оконное приложение на 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;
}
В какую сторону копать?