我有一個小的彈出窗口小部件的集合,出現在不同的地方,但每次只有一個。對於簡單的功能,新的顯示和刪除到隱藏是可以的,並且可以像它應該的那樣工作,但是當他們開始處理他們自己的數據時,我可以看到內存泄漏。爲什麼延遲加載的QWidget會顯示,但存儲的不是?
因此,因爲我只需要每種類型中的一種,所以我認爲我會在父構造函數中創建所有元素,並根據需要顯示並隱藏它們。據我所知,這應該工作,但popup - > show()不顯示。該示例所基於的複雜應用程序顯示彈出窗口確實存在於正確的位置,並且可以與用戶進行交互......但不可見。
這裏的懶惰版本顯示:
#ifndef MAIN_H
#define MAIN_H
#include <QtWidgets>
class Popup : public QLabel
{
Q_OBJECT
public:
explicit Popup(int x, int y, int width, int height, QWidget* parent = 0);
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget* parent = 0);
~MainWindow() {}
void mousePressEvent(QMouseEvent* ev);
private:
Popup* popup;
};
#endif // MAIN_H
/***************
*** main.cpp ***
***************/
#include "main.h"
#include <QApplication>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent)
{
popup = 0;
QWidget* cWidget = new QWidget(this);
cWidget->setStyleSheet("background-color: lightgray");
setCentralWidget(cWidget);
showMaximized();
}
void MainWindow::mousePressEvent(QMouseEvent* ev)
{
if(popup != 0)
{
if(!popup->geometry().contains(ev->x(), ev->y()))
{
delete popup;
popup = 0;
}
}
else
{
popup = new Popup(ev->x(), ev->y(), 100, 100, this);
popup->show();
}
ev->accept();
}
Popup::Popup(int x, int y, int width, int height, QWidget* parent) :
QLabel(parent)
{
setStyleSheet("background-color: black");
setGeometry(
x - (width/2), // Left
y - (height/2), // Top
width , // Width
height // Height
);
}
而這裏的預創建的版本,這並不表明:
#ifndef MAIN_H
#define MAIN_H
#include <QtWidgets>
class Popup : public QLabel
{
Q_OBJECT
public:
explicit Popup(QWidget* parent = 0);
void setup(int x, int y, int width, int height);
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget* parent = 0);
~MainWindow() {}
void mousePressEvent(QMouseEvent* ev);
private:
Popup* popup;
};
#endif // MAIN_H
/***************
*** main.cpp ***
***************/
#include "main.h"
#include <QApplication>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent)
{
popup = new Popup(this);
QWidget* cWidget = new QWidget(this);
cWidget->setStyleSheet("background-color: lightgray");
setCentralWidget(cWidget);
showMaximized();
}
void MainWindow::mousePressEvent(QMouseEvent* ev)
{
if(popup->isVisible())
{
if(!popup->geometry().contains(ev->x(), ev->y()))
{
popup->hide();
}
}
else
{
popup->setup(ev->x(), ev->y(), 100, 100);
popup->show();
}
ev->accept();
}
Popup::Popup(QWidget* parent) :
QLabel(parent)
{
setStyleSheet("background-color: black");
}
void Popup::setup(int x, int y, int width, int height)
{
setGeometry(
x - (width/2), // Left
y - (height/2), // Top
width , // Width
height // Height
);
}
我缺少什麼?
@馬丁感謝您的幫助。正如我的回答中所提到的,我最終使用了不同的解決方案,但是你讓我開始朝這個方向發展。 +1。 – AaronD