2013-03-19 52 views
3

我的Qt GUI應用程序中有一個實用程序類。然而,在我的便利班,我想打電話給QMessageBox::critical(),warning()等。該班不是QWidget,因此我不能通過this作爲家長。然而,我的課程從QObject分類,因此它可以運行諸如信號和插槽之類的東西。所以要解決這個問題 - 如果可能的話 - 我應該查看屬性API而不是使用Static API?如何在QWidget子類之外調用QMessageBox靜態API

類聲明:

class NetworkManager : public QObject 

這裏還有一個失敗的靜態API調用的例子:

QMessageBox::critical(this, tr("Network"), tr("Unable to connect to host.\n"), 
QMessageBox:Ok | QMessageBox:Discard); 

所以,如果我要建立一個物業基於API的消息框,會是莫名其妙地用QObject稱呼它?我沒有真正使用Property Based API,但是我從文檔中瞭解到它似乎使用了一個事件循環(即exec())。

+0

我以爲你可以通過'nullptr'?對於靜態便利方法,該對話框固定爲應用程序模式。 – cmannett85 2013-03-19 15:05:13

+0

這實際上是一個有趣的想法。這比使用我不熟悉的API重做10個以上的消息框要容易得多:P – ContingencyCoder 2013-03-19 15:11:08

回答

5

只是通過NULL第一個參數:

QMessageBox::critical(NULL, QObject::tr("Error"), QObject::tr("...")); 
2

不是通過nullptr一個更好的辦法是使用你已經在使用(假設NetworkManager的實例的父是一個QWidget QObject的樹;調整根據無論你的QObject樹的樣子)

QMessageBox::critical(qobject_cast<QWidget *> (parent()), "Title", "Message"); 

我們使用qobject_cast>的<而不是C或C++樣式轉換家長的數量是because it adds a little protection and will return 0,如果它不能向上投到QWidget *。

如果使用nullptr作爲集中在頂層窗口(QWidget的),而不是實際出現上漲在NetworkManager類QObject的樹窗口中QMessageBox就會出現。這真的讓那些擁有多臺顯示器,多個窗口打開,多個窗口來自多個顯示器的單個應用程序等等的人感到煩惱。

+0

這是一個非常好的主意。但是,NetworkManager基本上由MainWindow使用,因此使用nullptr應該沒問題。儘管如此,我會在未來記住這一點。 – ContingencyCoder 2013-03-19 18:58:37