在 Qt 窗口樹上尋找某個窗口

Node Editor中有許多窗口获讳,它們都是 主窗口 QMainWindow的子窗口惩坑。

  • Parameter Widget: 當點擊某個節(jié)點時,會顯示這個節(jié)點的信息占婉,以及可以調整的參數(shù)。 當前選中了 Comment 節(jié)點甫恩,在 Parameter Widget上可以顯示逆济、修改它的標題。同時 Comment節(jié)點也會聯(lián)動填物。

  • ListWidget: 節(jié)點列表纹腌。拖到 GraphicsView 時霎终,可以動態(tài)創(chuàng)建一個節(jié)點滞磺。

  • Graphics View: Graphics Scene 的視口。

image.png

這些窗口的父子關系如下莱褒,每一個方塊代表一個類击困。


窗口關系1.png

現(xiàn)在,需要判斷 Comment 節(jié)點是否被選中广凸。 如果選中阅茶,就根據(jù) Comment里的屬性字段,動態(tài)創(chuàng)建一個 QWidget 谅海,并添加到 Parameter Widget中脸哀。

Comment節(jié)點,其實是一個 QGraphicsItem對象扭吁。判斷QGraphicsItem是否被選中撞蜂,非常簡單盲镶,只要重寫一個虛函數(shù)即可:

QVariant DmGraphicsComment::itemChange(GraphicsItemChange change, const QVariant& value)
{
    /* 如果 GraphicsItem “被選中”這個狀態(tài)發(fā)生了改變... */
    if (change == QGraphicsItem::ItemSelectedChange)
    {
        if (!m_isSelected)
        {   
            m_isSelected = true;

            /* 做出相應的舉動 */
            Self::OnSelected();
        }
        else
        {
            m_isSelected = false;

            Self::OnUnselected();
        }
    }

    return Super::itemChange(change, value);
}

如何根據(jù)屬性動態(tài)生成不同的QWidget對象,需要反射的支持蝌诡,這個我們后來再說溉贿。我們假定下面代碼的dynamicUi變量是已經生成好的,那么浦旱,現(xiàn)在的重點變?yōu)橛钌趺丛诋斍暗拇翱跇湎拢业?em>parameterWidget颁湖,然后把dynamicUi掛在它的上面宣蠕,作為一個子窗口。

void DmGraphicsComment::OnSelected()
{
    /* 要如何實現(xiàn)這個函數(shù)爷狈? */
    QWidget* parameterWidget = FindWindowByObjectName("ParameterWidget");
    assert(parameterWidget && "Parameter widget is nullptr");

    /* 假定這個函數(shù)已經實現(xiàn) */
    QWidget* dynamicUi = GenerateDynamicUi();

    QLayout* layout = parameterWidget->layout();
    layout->addWidget(dynamicUi );
}

方法非常簡單植影,只有三步:

  • 給各窗口設置object name,比如MainWindowobject nameMainWindow涎永, ParameterWidgetobject nameParameterWidget
  • 找到名叫MainWindow的頂層窗口
  • MainWindow的子窗口里尋找名叫ParameterWidget的子窗口
QWidget* DmGraphicsComment::FindWindowByObjectName(const QString& name)
{
    /* 拿到 Graphics View 窗口 */
    QGraphicsView* graphicsView = Super::scene()->views()[0];
    assert(graphicsView && "Graphics view of the item is null");

    /* 遍歷所有父窗口思币,直到找到名叫 MainWindow 的父窗口。 線性查找羡微。 */
    QWidget* parentWidget = graphicsView->parentWidget();
    assert(parentWidget && "Parent widget of the graphics view is null");

    while (parentWidget && parentWidget->objectName() != "MainWindow")
    {
        parentWidget = parentWidget->parentWidget();
    }

    /* 調用 Qt Api谷饿,查找子窗口 */
    QWidget* parameterWidget = parentWidget->findChild<QWidget*>(name);

    /* 返回結果 */
    return parameterWidget;
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妈倔,隨后出現(xiàn)的幾起案子博投,更是在濱河造成了極大的恐慌,老刑警劉巖盯蝴,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毅哗,死亡現(xiàn)場離奇詭異,居然都是意外死亡捧挺,警方通過查閱死者的電腦和手機虑绵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闽烙,“玉大人翅睛,你說我怎么就攤上這事『诰海” “怎么了捕发?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長很魂。 經常有香客問我扎酷,道長,這世上最難降的妖魔是什么遏匆? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任法挨,我火速辦了婚禮骤铃,結果婚禮上,老公的妹妹穿的比我還像新娘坷剧。我一直安慰自己惰爬,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布惫企。 她就那樣靜靜地躺著撕瞧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狞尔。 梳的紋絲不亂的頭發(fā)上丛版,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音偏序,去河邊找鬼页畦。 笑死,一個胖子當著我的面吹牛研儒,可吹牛的內容都是我干的豫缨。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼端朵,長吁一口氣:“原來是場噩夢啊……” “哼好芭!你這毒婦竟也來了?” 一聲冷哼從身側響起冲呢,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤屈雄,失蹤者是張志新(化名)和其女友劉穎百宇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體席赂,經...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡鼻百,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年孵构,在試婚紗的時候發(fā)現(xiàn)自己被綠了橘券。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片党远。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖翰意,靈堂內的尸體忽然破棺而出木人,到底是詐尸還是另有隱情信柿,我是刑警寧澤冀偶,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站渔嚷,受9級特大地震影響进鸠,放射性物質發(fā)生泄漏。R本人自食惡果不足惜形病,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一客年、第九天 我趴在偏房一處隱蔽的房頂上張望霞幅。 院中可真熱鬧,春花似錦量瓜、人聲如沸司恳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扔傅。三九已至,卻和暖如春烫饼,著一層夾襖步出監(jiān)牢的瞬間猎塞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工杠纵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荠耽,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓比藻,卻偏偏與公主長得像铝量,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子银亲,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內容