QTableView nie ustawia szerokosć kolumn pod Linux

QTableView nie ustawia szerokosć kolumn pod Linux
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:13 minut
  • Postów:2102
0

Problem na ktorym chatgpt poległ :(

QTableView nie chce mi reagować poprawnie na ustawienie szerokości kolumn pod Linux
Minimalny przykład:

Kopiuj
#include <QApplication>
#include <QMainWindow>
#include <QTableView>
#include <QStandardItemModel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // Tworzenie głównego okna
    QMainWindow mainWindow;
    mainWindow.setWindowTitle("Przykład QTableView");

    // Tworzenie modelu danych
    QStandardItemModel model(3, 5); // 3 wiersze, 5 kolumn

    // Ustawianie nagłówków kolumn
    model.setHeaderData(0, Qt::Horizontal, "K1");
    model.setHeaderData(1, Qt::Horizontal, "K2");
    model.setHeaderData(2, Qt::Horizontal, "K3");
    model.setHeaderData(3, Qt::Horizontal, "K4");
    model.setHeaderData(4, Qt::Horizontal, "K5");

    // Dodawanie przykładowych danych
    for (int row = 0; row < 3; ++row) {
        for (int col = 0; col < 5; ++col) {
            QStandardItem *item = new QStandardItem(QString("Wiersz %1, Kolumna %2").arg(row + 1).arg(col + 1));
            model.setItem(row, col, item);
        }
    }

    // Tworzenie widoku tabeli
    QTableView *tableView = new QTableView;
    tableView->setModel(&model);

    // Ustawianie szerokości kolumn
    tableView->setColumnWidth(0, 50);
    tableView->setColumnWidth(1, 200);
    tableView->setColumnWidth(2, 100);
    tableView->setColumnWidth(3, 180);
    tableView->setColumnWidth(4, 120);

    // Ustawianie widoku tabeli jako centralnego widgetu
    mainWindow.setCentralWidget(tableView);

    std::string s1 = R"style(
        )style";  // FAIL 
    std::string s2 = R"style()style"; // OK 
    std::string s3 = R"style( )style"; // FAIL

std::string s4 = R"style(
    QTableView {
        border: 1px solid black;
        gridline-color: black;
    }
)style"; // FAIL      

    app.setStyleSheet(QString::fromStdString(s4));


    // Wyświetlanie głównego okna
    mainWindow.resize(800, 400);
    mainWindow.show();

    return app.exec();
}

Winowajcą jest linijka:

Kopiuj
app.setStyleSheet

jak jest co najmniej spacja to przestaje działać tableView->setColumnWidth

kompletny projekt z CMakeLists.txt
https://github.com/mariuszmaximus/bug_QTableVIew.git

Linux na ktorym to testuje uzywa Wayland-a , moze to ma jakieś znaczenie

Ktoś może ma akurat pod ręką Linux-a i moze sprawdzić
czy jest tak:
screenshot-20250116133749.png
czy tak:
screenshot-20250116133827.png


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:12 minut
1

Może to wina domyślnego stylu używanego na Linux.
Popróbuj uzy innego stylu, np:

Kopiuj
./bug_QTableVIew -style motif

https://doc.qt.io/qt-6/qapplication.html#QApplication


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Marius.Maximus
sprawdziłem style które były w moim systemie ale żadne nie pomógł
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:13 minut
  • Postów:2102
0

OK !
Akurat dla mojego Linux (z Wayland) trzeba troszkę później ustawiać szerokość kolumn, nie w konstruktorze tylko np. showEvent(QShowEvent* event)

Zrobiłem też testy na kilku różnych Linux bez Wayland i tam ta usterka nie występuję

źródło inspiracji


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
edytowany 1x, ostatnio: Marius.Maximus

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.