2013-07-30 2 views
3

Je suis nouveau à Qt, et je voulais implémenter certaines boîtes de dialogue pour un programme.QTabWidget dans une commutation QSplitter très lente

L'interface graphique de la boîte de dialogue est simple: il y a un arbre sur la gauche, et certains onglets sur la droite (le nombre d'onglets peut changer), et il y a quelques widgets à entrer dans chaque onglet. Mais quand j'ai implémenté cette boîte de dialogue avec Qt5.0.2, j'ai trouvé que c'était très lent quand je passais d'un onglet à l'autre. (habituellement plus de 0.1s pour commuter un onglet, parfois il a arrêté de répondre pendant plusieurs secondes si je clique au hasard sur les onglets pendant beaucoup de fois)

Je me demande si j'utilisais Qt dans un mauvais sens, ou si il y a quelque chose que je peux faire pour améliorer les performances

Voici un exemple pour mon scénario:

TestQT::TestQT(QWidget *parent) 
    : QMainWindow(parent) 
{ 

    QSplitter* pSplitter = new QSplitter(); 
    QTreeWidget* pTree = new QTreeWidget(); 

    pSplitter->addWidget(pTree); 

    QTabWidget* pTabs = new QTabWidget(); 

    for (int i = 0; i < 10; i++) 
    { 
     QWidget* pPage = new QWidget(); 
     QVBoxLayout* pLayout = new QVBoxLayout(); 
     for (int j = 0; j < 20; j++) 
     { 
      QHBoxLayout* pLineLayout = new QHBoxLayout(); 
      pLineLayout->addWidget(new QCheckBox()); 
      pLineLayout->addWidget(new QLineEdit()); 
      pLayout->addLayout(pLineLayout); 
     } 
     pPage->setLayout(pLayout); 

     pTabs->addTab(pPage, tr("Page%1").arg(i)); 
    } 

    pSplitter->addWidget(pTabs); 

    this->setCentralWidget(pSplitter); 
} 
+0

Travaille vite pour moi. Essayez d'exécuter le code sous profiler pour voir ce qui ralentit le programme. –

+0

Bonjour Riateche, pourriez-vous s'il vous plaît proposer un outil de profilage pour QT sur plateforme Windows? Merci! – Liven

+0

Si vous utilisez le compilateur MinGW, 'gprof' est correct. –

Répondre

0

Je suis d'accord avec Kuba. La plupart du temps, des dysfonctionnements de l'interface graphique se produisent lorsqu'une autre action bloque le thread sur lequel elle s'exécute. Dans ce cas, votre solution consiste à déplacer l'interface graphique ou cette action vers un autre thread.

Comme je ne vois ici que le code de l'interface graphique, essayons d'abord de déplacer l'interface graphique vers un autre thread. Avec l'en-tête QThread, ajoutez ces codes à votre fonction et voyez si cela aide:

QThread * t1 = new QThread(); 
this->moveToThread(t1); 
t1->start();