Здравствуйте, господа форумчане. Столкнулся на днях я с одной ситуацией.
При большом количестве QTreeWidgetItem-ов в QTreeWidget-е переставал нормально работать QScrollBar.
При захватывании курсором мыши ползунка в QScrollBar и попытке протаскать его для прокрутки списка
в QTreeWidget-е, ползунок очень медленно двигался или почти не двигался.
Искал решение данной проблемы очень долго. А в результате, оказалось, что я задал для всех QWidget-ов
в стиле все свойства margin в 0px. А так как для QScrollBar-а стиль я не указывал, он унаследовал все
свойства margin от QWidget.
Попробую на примере отобразить Вам данную ситуацию.
Вот исходный текст:
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
a.setStyleSheet("QWidget {margin-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px;}"); // виной всему был этот стиль
// если его убрать, то прокрутка ползунка в QScrollBar будет работать нормально,
// или если после него задать стиль для QScrollBar указав для него все margin.
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
int count = 1000;
QStringList list_headers;
list_headers << "1i" << "2i" << "3i";
ui->tree_wgt->setHeaderLabels(list_headers);
QTreeWidgetItem *tree_item[count];
for(int i=0; i<count; i++)
{
tree_item[i] = new QTreeWidgetItem();
tree_item[i]->setText(0, "1" + QString::number(i+1));
tree_item[i]->setText(1, "2" + QString::number(i+1));
tree_item[i]->setText(2, "3" + QString::number(i+1));
ui->tree_wgt->addTopLevelItem(tree_item[i]);
}
connect(ui->exit_but, SIGNAL(clicked(bool)), qApp, SLOT(quit()));
}
MainWindow::~MainWindow()
{
delete ui;
}
Может кто-то сталкивался с подобной ситуацией. У кого какие мысли по этому поводу?
Вот исходники примера приложения.