Forum: PC-Programmierung Qt new Widget wird nicht dargestellt


von Jasson J. (jasson)


Lesenswert?

Hoi zäme,

ich will mir ne schmale Neo-Pixel-Sim in Qt machen, wo eine 
QWidgets-basierte Formularklasse als Pixel verwendet wird, die dem 
entsprechend eine Methode SetColor(uint32_t col) hat, welche eine 32 Bit 
Zahl mit den 24 bit RGB Werten bekommt und das Widget dem entsprechend 
anmalt.

Das Problem ist, dass Widget wird nicht angezeigt. Wenn ich den Parent 
nicht setzte, wird es eben logelöst links oben im Bildschirm ge-show´t.

Zum setzten der Farbe benutze ich ein Stylesheet "background-color: 
rgb(64,16,120);" von dem ich weiß, dass es stimmt, weil ich die Farbe 
sehe, wenn ich eben den Parent von dem PixelWidget nicht setze.

Ja - ich hab versucht zu googlen...

App-Widget
1
#include "widget.h"
2
#include "ui_widget.h"
3
#include <QDebug>
4
5
Widget::Widget(QWidget *parent) :
6
    QWidget(parent),
7
    ui(new Ui::Widget)
8
{
9
    ui->setupUi(this);
10
    pixelList.append(new pixel());
11
    pixelList.last()->setGeometry((pixelList.length()-1)*20, 100, 20, 20);
12
    pixelList.last()->setParent(this);
13
    pixelList.last()->SetColor(4198520);
14
15
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(SltShow()));
16
}
17
18
Widget::~Widget()
19
{
20
    delete ui;
21
}
22
23
//nur ein Versuch...
24
void Widget::SltShow() 
25
{
26
    qDebug() << "Click";
27
    pixelList.last()->show();
28
}

Pixel-Widget
1
#include "pixel.h"
2
#include "ui_pixel.h"
3
4
#include <QDebug>
5
6
pixel::pixel(QWidget *parent) :
7
    QWidget(parent),
8
    ui(new Ui::pixel)
9
{
10
    ui->setupUi(this);
11
}
12
13
pixel::~pixel()
14
{
15
    delete ui;
16
}
17
18
void pixel::SetColor(uint32_t col)
19
{
20
    QString stSheet;
21
    unsigned int red, green, blue;
22
    red = (col & 16711680) >> 16;
23
    green = (col & 65280) >> 8;
24
    blue = col & 255;
25
    stSheet.append("background-color: rgb(");
26
    stSheet.append(QString::number(red));
27
    stSheet.append(',');
28
    stSheet.append(QString::number(green));
29
    stSheet.append(',');
30
    stSheet.append(QString::number(blue));
31
    stSheet.append(");");
32
    this->setStyleSheet(stSheet);
33
34
    qDebug() << stSheet;
35
}

von SkyperHH (Gast)


Lesenswert?

Ist das dein ganzes Programm?
Ich vermisse die Main Funktion, die dein Widget erzeugt... nutzt Du den 
UI-Designer?

Ich würde mir ein "Standart" Gerüst erzeugen lassen mit QMainWindow und 
dort dann mit dem UI-Designer ein normales QWidget platieren, das als 
"Platzhalter für eine benutzerdefinierte Klasse..." - deine Widget 
Klasse - nutzen und gut ist.
1
//main.c
2
#include "xxx.h" // Header File vom Widget
3
4
#include <QApplication>
5
int main(int argc, char *argv[])
6
{
7
    QApplication a(argc, argv);
8
    Widget w;
9
    w.show();
10
    return a.exec();
11
}

von Oliver S. (oliverso)


Lesenswert?

Häng mal dein ganzes Projekt hier als Anhang an, und zeig nicht nur ein 
paar Codeschnipsel.

Oliver

von Rolf M. (rmagnus)


Lesenswert?

Jasson J. schrieb:
> Das Problem ist, dass Widget wird nicht angezeigt. Wenn ich den Parent
> nicht setzte, wird es eben logelöst links oben im Bildschirm ge-show´t.

Warum es nicht erscheint, ist schwer zu sagen, wenn du nicht zeigst, wie 
du versuchst, es zu erzeugen.

von Jasson (Gast)


Lesenswert?

SkyperHH schrieb:
> Ist das dein ganzes Programm?
> Ich vermisse die Main Funktion, die dein Widget erzeugt... nutzt Du den
> UI-Designer?
>
> Ich würde mir ein "Standart" Gerüst erzeugen lassen mit QMainWindow und
> dort dann mit dem UI-Designer ein normales QWidget platieren, das als
> "Platzhalter für eine benutzerdefinierte Klasse..." - deine Widget
> Klasse - nutzen und gut ist.
> 1//main.c
> 2#include "xxx.h" // Header File vom Widget
> 34#include <QApplication>
> 5int main(int argc, char *argv[])
> 6{
> 7    QApplication a(argc, argv);
> 8    Widget w;
> 9    w.show();
> 10    return a.exec();
> 11}

Klar, das habe ich auch.

Das Problem lokalsiert sich in Pixelklasse

Cpp
1
#include "pixel.h"
2
#include "ui_pixel.h"
3
4
#include <QDebug>
5
6
pixel::pixel(QWidget *parent) :
7
    QWidget(parent),
8
    ui(new Ui::pixel)
9
{
10
    ui->setupUi(this);
11
    this->setStyleSheet("background-color: rgb(17, 252, 0);"); // trail-and-error
12
}
13
14
pixel::~pixel()
15
{
16
    delete ui;
17
}
18
19
void pixel::SetColor(uint32_t col)
20
{
21
22
    unsigned int red, green, blue;
23
    red = (col & 16711680) >> 16;
24
    green = (col & 65280) >> 8;
25
    blue = col & 255;
26
    stSheet.append("background-color: rgb(");
27
    stSheet.append(QString::number(red));
28
    stSheet.append(',');
29
    stSheet.append(QString::number(green));
30
    stSheet.append(',');
31
    stSheet.append(QString::number(blue));
32
    stSheet.append(");");
33
    this->setStyleSheet(stSheet);
34
35
    qDebug() << stSheet;
36
}

hpp
1
#ifndef PIXEL_H
2
#define PIXEL_H
3
4
#include <QWidget>
5
6
namespace Ui {
7
class pixel;
8
}
9
10
class pixel : public QWidget
11
{
12
    Q_OBJECT
13
14
public:
15
    explicit pixel(QWidget *parent = 0);
16
    ~pixel();
17
    void SetColor(uint32_t col);
18
19
private:
20
    Ui::pixel *ui;
21
    QString stSheet;
22
};
23
24
#endif // PIXEL_H

Wenn ich "Anwendungswidget" nicht eins meiner Pixel erstelle, sondern 
ein ganz normales Widget und da das selbe Stylesheet setzt, wird das 
Widget angezeigt.

von Jasson (Gast)


Lesenswert?

Wenn ich IM "Anwendungswidget"

von Oliver S. (oliverso)


Lesenswert?

Dann wird der Fehler wohl in Zeile 42 deines nicht gezeigten Codes 
stecken. Ohne hier ein vollständiges Codebeispiel zu zeigen, wirst du 
alleine weitersuchen müssen.

Oliver

von Jasson (Gast)


Lesenswert?

Niemand zwingt dich hier rein zu schauen oder zu kommentieren -

Wenn man sich die Klasse ansieht, erkennt man, dass sie nur von QWidget 
erbt und eine weitere Methode hat.
Wenn dem entsprechend das übrige Programm funktioniert wenn ich statt 
dessen ein plain ein QWidget verwende, liegt es an dem gezeigten Code 
meiner weiterten Klasse.
Da bringt der übrige Quelltext keine weitere Weisheit.

von Rolf M. (rmagnus)


Lesenswert?

Jasson schrieb:
> Wenn ich "Anwendungswidget" nicht eins meiner Pixel erstelle, sondern
> ein ganz normales Widget und da das selbe Stylesheet setzt, wird das
> Widget angezeigt.

Im gezeigten Code gibt es keinen erkennbaren Grund dafür. Was erwartest 
du jetzt? Was macht eigentlich das ui-File deiner Pixel? Ist da 
vielleicht irgendwas drin?

ÜBrigens: Für ein paar Pixel macht das sicher nicht viel aus, aber was 
du da zeigst, wäre so ziemlich die ineffizienteste Methode, die mir 
einfallen würde, um so was zu machen.

von Oliver S. (oliverso)


Lesenswert?

Jasson schrieb:
> Wenn dem entsprechend das übrige Programm funktioniert wenn ich statt
> dessen ein plain ein QWidget verwende, liegt es an dem gezeigten Code
> meiner weiterten Klasse.

Frei nach Sherlock Holmes: wenn alle möglichen Gründe ausgeschlossen 
wurden, bleibt nur das Unmögliche.

Und das ist in deinem Fall der Rest der Codes.

Also zeig den Code des MainWindows oder Frames, in dem du das 
Pixel-Widget erzeugst. Da wird der oder besser die Fehler stecken.

Mal ins blaue gefragt: sagt dir Layout was?

Oliver

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.