用于IOS开发的QMessagebox的任何替代解决scheme(仅QWidget应用程序)?
我正在使用Qt 5.3并试图开发IOS的应用程序。
问题是,iPhone Retina模拟器中的QWidget应用程序:
- QMessage变成全屏。
- 在应用程序输出面板中我看到:这个插件不支持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); }
希望有所帮助。