Russian Qt Forum
Ноябрь 01, 2024, 08:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему margin в стиле QWidget влияет на работу QScrollBar?  (Прочитано 2045 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Май 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;
}

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

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Май 05, 2017, 10:21 »

Логично, учитывая что QScrollBar наследуется от QWidget
Вы можете добавить в стилях инфу для QScrollBar, в которой margin возвращается в правильное значение
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.137 секунд. Запросов: 23.