2013-07-30 3 views
3

Я новичок в Qt и хотел реализовать некоторые диалоги для программы.QTabWidget внутри переключения QSplitter очень медленно

Графический интерфейс диалога прост: слева находится дерево, а справа - несколько вкладок (количество вкладок может меняться), и на каждой вкладке есть некоторые виджеты.

Но когда я внедрил это диалоговое окно с Qt5.0.2, я обнаружил, что очень медленно при переключении вкладок. (обычно более 0,1 с для переключения вкладки, иногда она перестает отвечать на несколько секунд, если я случайно нажимаю на вкладки много раз)

Мне интересно, не использовал ли я Qt неправильным способом, или если есть кое-что я могу сделать, чтобы улучшить производительность

Вот пример моего сценария:

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

Работает быстро для меня. Попробуйте запустить код под профилировщиком, чтобы узнать, что замедляет работу программы. –

+0

Здравствуйте, Riateche, не могли бы вы предложить инструмент для профилирования QT на платформе Windows? Благодаря! – Liven

+0

Если вы используете компилятор MinGW, 'gprof' в порядке. –

ответ

0

Я согласен с Kuba. В большинстве случаев сбои графического интерфейса возникают, когда другое действие блокирует поток, на котором он запущен, поэтому ваше решение в этих случаях должно либо переместить графический интерфейс, либо это действие в другой поток.

Поскольку я вижу только код для графического интерфейса здесь, попробуем сначала перенести графический интерфейс в другой поток. С заголовком QThread, добавьте эти коды в свою функцию и посмотрите, не поможет ли это:

QThread * t1 = new QThread(); 
this->moveToThread(t1); 
t1->start(); 
Смежные вопросы