Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Май 05, 2017, 09:26



Название: Почему margin в стиле QWidget влияет на работу QScrollBar?
Отправлено: billy4685 от Май 05, 2017, 09:26
Здравствуйте, господа форумчане. Столкнулся на днях я с одной ситуацией.
При большом количестве 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;
}

Может кто-то сталкивался с подобной ситуацией. У кого какие мысли по этому поводу?
Вот исходники примера приложения.


Название: Re: Почему margin в стиле QWidget влияет на работу QScrollBar?
Отправлено: gil9red от Май 05, 2017, 10:21
Логично, учитывая что QScrollBar наследуется от QWidget
Вы можете добавить в стилях инфу для QScrollBar, в которой margin возвращается в правильное значение