用于IOS开发的QMessagebox的任何替代解决scheme(仅QWidget应用程序)?

我正在使用Qt 5.3并试图开发IOS的应用程序。

问题是,iPhone Retina模拟器中的QWidget应用程序:

  1. QMessage变成全屏。
  2. 在应用程序输出面板中我看到:这个插件不支持propagateSizeHints()。

所以寻找QMessageBox的替代解决scheme。 我不想学习QML。

如果你在你的小部件顶部做一个覆盖,你可以做类似的iOSpopup窗口。

基本上你可以创build另一个小部件,然后把它放到你想要绘制的小部件上面。

这里有一些有用的标志和代码行放在你的覆盖构造函数中:

setPalette(Qt::transparent); // if you have buttons on this overlay you probably don't want this one setAttribute(Qt::WA_TransparentForMouseEvents); QGraphicsDropShadowEffect * dse = new QGraphicsDropShadowEffect(); dse->setBlurRadius(20); this->setGraphicsEffect(dse); 

那么当父窗口小部件resize时,一定要命令重叠大小:

 void ParentWidget::resizeEvent(QResizeEvent *event) { overlay->resize(event->size()); event->accept(); } 

http://www.qtcentre.org/wiki/index.php?title=Widget_Overlay

更新:令人敬畏的例子

叠加消息框的屏幕截图

main.cpp中

 #include <QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); w.resize(300,600); return a.exec(); } 

mainwindow.h

 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "overlaydialogbox.h" #include <QResizeEvent> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); public slots: void resizeEvent(QResizeEvent *event); private: OverlayDialogBox * m_overlay; }; #endif // MAINWINDOW_H 

mainwindow.cpp

 #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { m_overlay = new OverlayDialogBox(this); } MainWindow::~MainWindow() { } void MainWindow::resizeEvent(QResizeEvent *event) { m_overlay->resize(event->size()); event->accept(); } 

overlaydialogbox.h

 #ifndef OVERLAYDIALOGBOX_H #define OVERLAYDIALOGBOX_H #include <QWidget> class OverlayDialogBox : public QWidget { Q_OBJECT public: explicit OverlayDialogBox(QWidget *parent = 0); signals: void accepted(); void rejected(); void finished(int); public slots: }; #endif // OVERLAYDIALOGBOX_H 

overlaydialogbox.cpp

 #include "overlaydialogbox.h" #include <QGridLayout> #include <QGraphicsEffect> #include <QLabel> #include <QDialogButtonBox> #include <QMessageBox> #include <QIcon> OverlayDialogBox::OverlayDialogBox(QWidget *parent) : QWidget(parent) { setPalette(Qt::transparent); // if you have buttons on this overlay you probably don't want this one // setAttribute(Qt::WA_TransparentForMouseEvents); QGraphicsDropShadowEffect * dse = new QGraphicsDropShadowEffect(); dse->setBlurRadius(20); this->setGraphicsEffect(dse); QGridLayout * grid = new QGridLayout(); this->setLayout(grid); QMessageBox * msg = new QMessageBox(QMessageBox::Warning,"Testing","This is a test QMessageBox."); QObject::connect(msg, SIGNAL(accepted()), this, SIGNAL(accepted())); QObject::connect(msg, SIGNAL(finished(int)), this, SIGNAL(finished(int))); QObject::connect(msg, SIGNAL(rejected()), this, SIGNAL(rejected())); QObject::connect(msg, SIGNAL(finished(int)), this, SLOT(close())); msg->setPalette(Qt::white); grid->addWidget(msg); } 

希望有所帮助。