我有两个小部件定义如下
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?
如何调用小部件上的函数关闭?
答案 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();
}