2014-07-03 29 views
0

您使用什麼技術在沒有彈出對話框的GUI中顯示消息?GUI設計 - 顯示沒有彈出對話框的消息

彈出對話框通常是相當可怕的用戶 - 他們得到的方式,往往你不感興趣,你只是導致了錯誤。另一種是剛忽略的錯誤,什麼也不做

然而,也有可能是誰想要知道他們什麼時候導致錯誤偶爾用戶...

所以你要顯示的信息消息,但沒有要求的用戶必須點擊煩人的彈出框。

一個選項可能是使用主窗口的狀態欄,但爲了讓任何小部件使用它,你需要傳遞引用這個該死的狀態欄(我在這裏想到python/qt)......它很快變得混亂,並刪除小組件「resuability」(想象你創建一個應用,沒有一個狀態,你想它...重用一個widget)...

任何想法?

回答

1

一種選擇是使用主窗口的狀態欄,但爲了任何部件上使用它,你需要周圍的引用傳遞給這個該死的狀態欄

設計正確,這情況並非如此。我的許多類都有一個日誌信號是這樣的: -

void Log(const QString& message, enum LogPriority priority); 

的優先級是一個枚舉,用來定義的信息化水平,無論它是一個調試消息,警告,錯誤,嚴重錯誤等

另外,我有一個帶有匹配日誌插槽的日誌記錄類。您可以將此設置爲singleton,或者只需使用static方法。

類將它們的信號直接連接到日誌記錄類或父信號。這可以確保該類不關心發送日誌消息時發生的情況。您也可以通過刪除其連接來禁用某個類的日誌。

對於記錄本身,Log類可以選擇要麼設置信息欄上的文字,寫一個文件,顯示通知(OSX)或任何你想要的其他方法。

雖然我的方法使用C++,但我希望您可以在Python中執行相同或類似的操作。

+0

我們回答大部分都是一樣的.. :) – ABCplus

+0

@ABCplus,偉大的思想! – TheDarkKnight

+0

我們正在爲同一個項目工作嗎? :) – ABCplus

1

我已經在我的QT/C++應用程序做什麼,是在所謂的「留言板」的主要窗口QDockedWidget,含警告/錯誤/信息的郵件列表。用戶可以刪除它。爲了不傳遞這個QDockedWidget的所有小部件的引用,我使用(爲了其他許多目的...)一個具有全局可見性的SharedData類,它構建爲應用程序的單例。所以,每一個widget作爲一個全球性的參考,並可以設置錯誤或警告,或別的東西:

Gshared->setError("oops!", ErrorType::Critical); 

在這裏SETERROR功能我發出一個信號,即通過在QDockedWidget插槽逮住(用於顯示錯誤),通過日誌記錄管理器(即在日誌文件中有關錯誤的更多詳細信息)寫道,等等

的另一種選擇是在自定義消息框的「不再顯示」複選框。

0

首先,它的消息和顯示小部件是兩個單獨的東西。將它們壓在一起是嚴重的設計錯誤。

一個典型的解決方案會有某種記錄器/消息接收器,它是一個單一的語義,但不一定使用單例模式實現。接收器可以是QObject,以便您可以輕鬆地將消息源連接到接收器。接收器可以被附加到一個或多個顯示小部件。

感謝QObject以及qApp是全局實例指針,QCoreApplicationQObject這一事實,因此很容易將水槽穿過。因此,你可以:

  1. 通過動態屬性系統傳遞指針,或

  2. 使水槽的全局應用程序對象的唯一的孩子。

查看下面的例子。請注意,Widget只需要知道MessageSink類的聲明。它不需要明確地傳遞任何實例。原來的單身模式也不是。

class MessageSink : public QObject { 
    Q_OBJECT 
public: 
    MessageSink(QObject * parent = 0) : QObject(parent) {} 
    Q_SIGNAL void message(const QString &); 
    static MessageSink * instance() { return qApp->findChild<MessageSink*>(); } 
}  

class Widget : public QWidget { 
    QVBoxLayout m_layout; 
    QLabel m_l1, m_l2; 
public: 
    Widget(QWidget * parent = 0) : QWidget(parent), m_layout(this) { 
    m_layout.addWidget(&m_l1); 
    m_layout.addWidget(&m_l2); 
    m_l1.connect(MessageSink::instance(), SIGNAL(message(QString)), SLOT(setText(QString))); 
    m_l2.connect(MessageSink::instance(), SIGNAL(message(QString)), SLOT(setText(QString))); 
    } 
} 

int main(int argc, char ** argv) { 
    QApplication app(argc, argv); 
    MessageSink sink(&app); 
    Widget w; 
    w.show(); 
    emit sink.message("Hello!"); 
    return app.exec(); 
} 

注意:這是不是一個錯誤,有一個本地QObject有一個父母。你只需要確保it gets destructed before the parent。 C++在這裏保證。