Qt, не могу отобразить дочерний виджет - PullRequest
2 голосов
/ 23 апреля 2010

У меня есть два виджета, определенных следующим образом

class mainWindow : public QWidget
{
    Q_OBJECT
public:
    mainWindow();
    void readConfig();
private:
    SWindow *config;
    QVector <QString> filePath;
    QVector <QLabel*> alias,procStatus;
    QVector <int> delay;
    QGridLayout *mainLayout;
    QVector<QPushButton*> stopButton,restartButton;
    QVector<QProcess*> proc;
    QSignalMapper *stateSignalMapper, *stopSignalMapper, *restartSignalMapper;
public slots:
    void openSettings();
    void startRunning();
    void statusChange(int);
    void stopProc(int);
    void restartProc(int);
    void renew();
};
class SWindow : public QWidget
{
    Q_OBJECT
public:
    SWindow(QWidget *parent=0);
    void readConfig();
    void addLine(int);
private:
    QVector<QPushButton*> selectButton;
    QVector<QLabel*> filePath;
    QVector<QLineEdit*> alias;
    QSignalMapper *selectSignalMapper;
    QVector<QSpinBox*> delay;
    QGridLayout *mainLayout;
public slots:
    void selectFile(int);
    void saveFile();
    void addLineSlot();
};

когда я создаю и отображаю объект SWindow из mainWindow следующим образом

void mainWindow::openSettings()
{
    config = new SWindow();
    config->show();
}

все в порядке, но теперь мне нужно получить доступ к главному окну из SWindow, и

void mainWindow::openSettings()
{
    config = new SWindow(this);
    config->show();
}

не отображает SWindow. Как я могу отобразить SWindow?

Как вызвать функцию при закрытии виджета?

Ответы [ 3 ]

2 голосов
/ 23 апреля 2010

По умолчанию QWidget не является окном . Если это не окно и вы указываете родителя, оно будет отображаться внутри родителя (поэтому в вашем случае оно, вероятно, скрыто другими виджетами внутри вашего mainWindow).

Посмотрите на windowFlags() тоже. Или вы можете сделать ваше SWindow наследуемым от QDialog, в зависимости от того, для чего вы его используете.

Что касается вызова функции при закрытии виджета: вы можете переопределить closeEvent().

2 голосов
/ 23 апреля 2010

Как отмечает Leiaz, вы можете использовать флаг windowsFlags при создании виджета. Это будет выглядеть так:

void mainWindow::openSettings()
{
    config = new SWindow(this, Qt::window);
    config->show();
}

Чтобы переопределить closeEvent:

Заголовок:

protected:
  virtual void closeEvent ( QCloseEvent * event )

касты:

 void sWindow::closeEvent(QCloseEvent *event)
 {
     this->parentWidget()->SomeFunction();
     qWidget::closeEvent(event);
 }

Однако, вероятно, лучше использовать сигнал / слоты для вашего случая здесь. Так как вы сказали, что хотите вызвать метод пролонгации родителя при нажатии какой-либо кнопки в sWindow, вам нужно испускать сигнал при каждом нажатии кнопки и соединять этот сигнал в родительском элементе с гнездом обновления родителя.

void sWindow::sWindow()
{
  ...
  connect(ui.button, SIGNAL(clicked()), this, SLOT(btnClicked()));
}
void sWindow::btnClicked()
{
  // whatever else the button is supposed to do
  emit buttonClicked();
}

и в вашем родительском классе

void mainWindow::openSettings()
{
    config = new SWindow(this, Qt::window);
    connect(config, SIGNAL(buttonClicked()), this, SLOT(refresh()));
    config->show();
}
2 голосов
/ 23 апреля 2010

Когда вы делаете config = new SWindow(this);, вы устанавливаете родительский элемент config в качестве экземпляра mainWindow.

Это означает, что config больше не является виджетом верхнего уровня, поэтому он не будет отображаться за пределами экземпляра mainWindow (в частности, он должен быть центральным виджетом или внутри макета mainWindow экземпляра, чтобы отображается).

РЕДАКТИРОВАТЬ: Извините - я пропустил ваш последний вопрос; Как вызвать функцию при закрытии виджета

Вы захотите переопределить метод QWidget::closeEvent(QCloseEvent *event). Это вызывается, когда вы закрываете виджет верхнего уровня. Самое практичное, что нужно сделать - это emit() сигнал, чтобы другой класс мог обрабатывать его, когда он был закрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...