Qt 32-bit na Windows 7 64-bit - kłopoty z działaniem programu

0

Mam problem z pisaniem programu w QtCreator na Windows 7 64-bit.

Zainstalowałem najnowszą wersję 32 bitową Qt, konkretnie tą:
Qt 5.3.2 for Windows 32-bit (MinGW 4.8.2, OpenGL, 737 MB). Używam tej wersji ponieważ tej samej z tym samym kompilatorem używam na Linuksie.

Kompiluję kod który około miesiąca temu pisałem na Linuksie, który działał bez problemów. Teraz kod też się kompiluje, ale są pewne błędy w działaniu programu, np. ScrollBar w QPlainTextEdit w którym ustawiłem własne kolory używając setStyleSheet ma tło w innym kolorze niż powinien. Nie działają też skróty klawiszowe które na Linuksie działały bez problemów (np. włączanie trybu full screen).

Kod który wcześniej uruchamiałem na Linuksie też kompilowałem w 32-bitowej wersji, ale na 32-bitowym systemie. Teraz mam Windows 7 64-bit. Czy po przesiadce są wymagane jakieś zmiany w kodzie?

0

Bitowość systemu nie ma tu znaczenia.

Być może ScrollBar pod Windows zachowuje się tak jak się zachowuje - podałbyś kod, i screena, to może coś się zobaczy.

0
  1. to, że kod działa na jakimś systemie nie oznacza, że jest prawidłowy. Często się zdarza, że zmiana platformy ujawnia poważne błędy w kodzie (c++)
  2. brak konkretów w opisie problemu, są same ogólniki
  • pokaż style sheet, który nie działa
  • jakie skróty klawiszowe ci nie działają i jak je definiujesz (może system sam obsługuje te skróty, może Qt inaczej dowiązuje klawisze pod windowsem). Poza tym Windows z polską klawiaturą programisty lubi chrzanić skróty klawiszowe.
  1. 32vs64 bity miałoby znacznie, gdybyś kompilował program pod różne architektury.
0

Dzięki z odpowiedzi.

Przepisałem fragmenty programu tak żeby wyszła aplikacja okienkowa z kodem, z którym miałem problemy.
Nie wiem co się stało, ale w tej małej aplikacji, gdzie kod jest praktycznie ten sam, skróty klawiszowe mi działają, okienko zmienia rozmiar na podany (wcześniej też nie mogłem tego zrobić), tylko mam jeszcze problem z tym QScrollBarem. Podaję kod:

TestDocument.h

#ifndef TESTDOCUMENT_H
#define TESTDOCUMENT_H

#include <QtGui>
#include <QPlainTextEdit>

class TestDocument : public QPlainTextEdit
{
    Q_OBJECT

public:
    TestDocument();
};

#endif // TESTDOCUMENT_H

TestDocument.cpp

#include <TestDocument.h>

TestDocument::TestDocument()
{
    setStyleSheet("QPlainTextEdit{"
                  "color: white; background-color: black}"
                  "QScrollBar:vertical{background:black}"
                  "QScrollBar::handle:vertical {border: 1px solid #FFFFFF; min-height: 30px}"
                  "QScrollBar::add-line:vertical {height: 0px}"
                  "QScrollBar::sub-line:vertical {height: 0px}");
}

TestApplication.h

#ifndef TESTAPPLICATION_H
#define TESTAPPLICATION_H

#include <TestDocument.h>
#include <QMainWindow>
#include <QShortcut>
#include <QVBoxLayout>

class TestApplication : public QMainWindow
{
    Q_OBJECT

public:
    TestApplication();

private:
    QVBoxLayout *layoutMain;
    QWidget *window;
    TestDocument *document;
    QShortcut *shortcutShowFullScreen;
    bool fullScreenEnabled;

private slots:
    void ShowFullScreen();
};

#endif // TESTAPPLICATION_H

TestApplication.cpp

#include <TestApplication.h>

TestApplication::TestApplication()
{
    int sizeX = 700;
    int sizeY = 400;
    fullScreenEnabled = false;

    document = new TestDocument;

    shortcutShowFullScreen = new QShortcut(QKeySequence("Alt+F"), this);
    connect(shortcutShowFullScreen, SIGNAL(activated()), this,
            SLOT(ShowFullScreen()));

    layoutMain = new QVBoxLayout;
    layoutMain->addWidget(document);
    window = new QWidget;
    window->setLayout(layoutMain);
    setCentralWidget(window);
    setMinimumSize(400, 200);
    resize(sizeX, sizeY);
}

void TestApplication::ShowFullScreen()
{
    fullScreenEnabled = !fullScreenEnabled;

    if (fullScreenEnabled == true)
        showFullScreen();
    if (fullScreenEnabled == false)
        showNormal();
}

main.cpp

#include <QApplication>
#include <TestApplication.h>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    TestApplication testApp;
    testApp.show();
    return app.exec();
}

A całość wygląda tak:
user image

I chodzi mi o to tło ScrollBara, ta drobna biało-czarna krateczka która powinna być czarna. Na Linuksie wyglądało to tak jak powinno, a na Windowsie nie wiem o co chodzi.

A co do reszty kłopotów, przed chwilą skomentowałem jedną, linijkę która nie powinna mieć znaczenia, i po skompilowaniu wysypała się cała masa błędów. Także pewnie będę musiał przepisać wszystko na nowo.

1

Po kiego grzyba dzidziczysz tylko po to by zmienić style sheet?
Style sheet można ustawić na QApplication i zadziała na całą aplikację lub na dowolnym widget'cie i zadziała na tego widgeta i wszystkich potomków.

Tak poza tym, na pierwszy rzut oka wygląda OK.
Przypuszczalnie problemem jest styl. Niektóre style Qt niebyt dobrze obsługują style sheet, być może styl ładowany domyślnie dla twojego Windowsa ma właśnie taki problem.
Uruchom swój program z parametrem zmieniającym styl np:

twojProgram -style=motif

Tak możesz wymusić styl Linux uruchamiając program na Windows (można też na odwrót).


edit: Pod Linux i wymusiłem styl Windows i odtworzyłem dokładnie ten sam problem (na swoim kodzie z Qt 5.2.1).
0

Dzięki za odpowiedź.

QTestDocument jest osobno bo w programie ma mieć sporo kodu, nie chcę mieć wszystkiego w jednym miejscu, ale czytelnie posegregowane. To co podałem to tylko mały fragmencik tego co w nim będzie. Poza tym nie chcę stosować stylów do całej aplikacji, tylko do niektórych widgetów.

Przepisałem kod na nowo, uruchomiłem używając stylu Fusion i... działa tak jak powinien.

Dzięki.

0

Z tego co ustaliłem, problem polega na tym, że używane jest brush ze wzorkiem Qt:Dence4Pattern i masz kontrole tylko nad jednym kolorem. Szukałem jakby można było zmienić kolor alternatywny, ale nic nie zadziałało, albo jak można wymusić brak wzoru dla bush-a ale też nie znalazłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1