Qt,无法显示子窗口小部件

时间:2010-04-22 21:54:10

标签: c++ qt interface

我有两个小部件定义如下

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();
};

当我从mainWindow创建和显示SWindow对象时,就像这样

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

一切正常,但现在我需要从SWindow访问mainWindow,并且

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

不显示SWindow。我该如何显示SWindow?

如何调用小部件上的函数关闭?

3 个答案:

答案 0 :(得分:2)

当您执行config = new SWindow(this);时,您将config的父级设置为mainWindow的实例。

这意味着config不再是顶级窗口小部件,因此它不会显示在mainWindow实例之外(具体来说,它需要是中心窗口小部件或{{1}内部要显示的实例布局。)

编辑:抱歉 - 我错过了你的上一个问题; 如何在小部件关闭上调用函数

您需要覆盖mainWindow方法。当您关闭顶级窗口小部件时会调用此方法。最实际的做法是QWidget::closeEvent(QCloseEvent *event)一个信号,以便另一个类可以处理它已被关闭。

答案 1 :(得分:2)

默认情况下为QWidget isn't a window。如果它不是窗口并且您指定了父窗口,它将显示在父窗口内(因此在您的情况下,它可能被mainWindow中的其他窗口小部件隐藏)。

同样查看windowFlags()。或者,您可以将SWindow继承自QDialog,具体取决于您使用的内容。

至于调用widget关闭时的函数:你可以重新实现closeEvent()

答案 2 :(得分:2)

如Leiaz所述,您可以在创建窗口小部件时使用windowsFlags标志。它看起来像这样:

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

重新实现closeEvent:

头:

protected:
  virtual void closeEvent ( QCloseEvent * event )

CPP:

 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();
}