2016-08-27 41 views
0
#include <QApplication> 
#include <QDebug> 
#include <QDialog> 
#include <QPushButton> 
#include <QTreeWidget> 
#include <QVBoxLayout> 

int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 

    QDialog dialog; 
    QVBoxLayout layout(&dialog); 

    QTreeWidget treeWidget; 
    treeWidget.insertTopLevelItem(0, new QTreeWidgetItem(&treeWidget)); 
    QObject::connect(&treeWidget, &QTreeWidget::activated, [&treeWidget]() { 
     auto secondDialog = new QDialog(&treeWidget); 
     auto layout = new QVBoxLayout(secondDialog); 
     auto button = new QPushButton(); 
     QObject::connect(button, &QPushButton::clicked, []() { 
      qDebug() << "button clicked"; 
     }); 
     layout->addWidget(button); 
     secondDialog->show(); 
    }); 
    layout.addWidget(&treeWidget); 

    dialog.show(); 

    return app.exec(); 
} 

當我通過按下Enter鍵激活QTreeWidget的項目時,嵌套對話框被創建並立即按下它內部的按鈕。我如何擺脫它?嵌套的QDialog會自動按下其中的一個QPushButton

+0

你是什麼意思的「激活」,你點擊樹形控件? – jpo38

+0

在樹形構件中選擇一個項目,然後按enter鍵。 –

+0

如果您使用'dialog'而不是'treeWidget'作爲'secondDialog'的父項,該怎麼辦? – jpo38

回答

0

我解決了這個通過重寫QTreeView則這是該對話框中的keyPressEvent:

class EnterEatingTreeView : public BaseTreeView 
    { 
    public: 
     explicit EnterEatingTreeView(QWidget* parent = nullptr) 
      : BaseTreeView(parent) 
     { 

     } 
    protected: 
     void keyPressEvent(QKeyEvent* event) override 
     { 
      BaseTreeView::keyPressEvent(event); 
      switch (event->key()) { 
      case Qt::Key_Enter: 
      case Qt::Key_Return: 
       event->accept(); 
      } 
     } 
    }; 

這樣緊迫的不傳遞給其父進入裏面QTreeView則關鍵。

相關問題