Seite 1 von 1
X Error: BadMatch (invalid parameter attributes)
Verfasst: 30. Juni 2009 15:20
von oracle
Guten Tag,
In meiner Anwendung habe ich einen einfachen Input Dialog.
Wenn ich den Dialog das erste mal starte klappt alles wunderbar. Beim zweiten erscheinen des Dialogs werden die verschiedenen Elemente innerhalb des Windows allerdings nicht mehr angezeigt. Auf der Konsole erhalte ich die Fehlermeldung:
Code: Alles auswählen
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 42 (X_SetInputFocus)
Serial number of failed request: 61561
Current serial number in output stream: 63125
.. und das Programm scheint in einer Endlosschleife festzuhängen.
Hat jemand eine Ahnung was diese Fehlermeldung bedeutet?
Verfasst: 30. Juni 2009 15:35
von solarix
Mit diesen Angaben kann man nur oraceln..
- Hast du solche Ausgaben auch bei Qt-Demos?
- Kannst du das Problem im kleinen Rahmen reproduzieren und den Code dazu zeigen?
Verfasst: 30. Juni 2009 15:50
von oracle
solarix hat geschrieben:Mit diesen Angaben kann man nur oraceln..
- Hast du solche Ausgaben auch bei Qt-Demos?
Nein, da läuft alles wunderbar.
Auch das Programm läuft eigentlich sonst so wie es sollte.
solarix hat geschrieben:- Kannst du das Problem im kleinen Rahmen reproduzieren und den Code dazu zeigen?
Beim zweiten ausführen dieses Codes tritt das Problem auf:
Code: Alles auswählen
bool InterModule::getRange(int& a, int& b) {
Vec2i range;
RangeDialog rd(NULL, a,b);
if (rd.exec() == QDialog::Accepted) {
range = rd.getRange();
a = range.x();
b = range.y();
return true;
}
else
return false;
}
wobei RangeDialog so aussieht:
Code: Alles auswählen
#include "rangeDialog.h"
//Added by qt3to4:
#include <Q3GridLayout>
RangeDialog::RangeDialog(QWidget *parent, int lowVal, int highVal) : QDialog (parent,0,TRUE) {
//QIntValidator v(lowVal, highVal, this);
QString num;
lowEdit = new QLineEdit(this);
highEdit = new QLineEdit(this);
lowEdit->setMaxLength(3);
//lowEdit->setValidator(&v);
num.setNum(lowVal);
lowEdit->setText(num);
highEdit->setMaxLength(3);
//highEdit->setValidator(&v);
num.setNum(highVal);
highEdit->setText(num);
lay = new Q3GridLayout(this,2,2);
layout()->add(lowEdit);
layout()->add(highEdit);
_ok = new QPushButton("Ok",this);
_ok->setDefault(true);
connect(_ok,SIGNAL(clicked()), this, SLOT(accept()));
_cancel = new QPushButton("Cancel",this);
connect(_cancel,SIGNAL(clicked()), this, SLOT(reject()));
layout()->add(_ok);
layout()->add(_cancel);
setAttribute(Qt::WA_NativeWindow);
}
Vec2i RangeDialog::getRange() const {
bool ok;
Vec2i res;
QString out = lowEdit->text();
res.set_x(out.toInt(&ok));
assert(ok);
out = highEdit->text();
res.set_y(out.toInt(&ok));
assert(ok);
//assert(res.x() >= lowVal && res.y() <= highVal);
return res;
}
Das Seltsame:
An anderen Stellen wird dieser Abschnitt auch aufgerufen, da funktioniert das Ganze auch nach mehrmaligen aufrufen noch wunderbar!!
Verfasst: 30. Juni 2009 16:16
von solarix
An anderen Stellen wird dieser Abschnitt auch aufgerufen, da funktioniert das Ganze auch nach mehrmaligen aufrufen noch wunderbar!!
Das ist typisch für fehlerhafte Pointeroperationen... Hat "RangeDialog" noch ein Destruktor?
Verfasst: 30. Juni 2009 16:20
von oracle
solarix hat geschrieben:
An anderen Stellen wird dieser Abschnitt auch aufgerufen, da funktioniert das Ganze auch nach mehrmaligen aufrufen noch wunderbar!!
Das ist typisch für fehlerhafte Pointeroperationen... Hat "RangeDialog" noch ein Destruktor?
Hmm, ok.
Aber dann müsste einen Fehler direkt in RangeDialog liegen. Muss das nochmals genau anschauen.
RangeDialog hat einen Destruktor. Das Header File sieht so aus:
Code: Alles auswählen
#ifndef RANGEDIALOG_H
#define RANGEDIALOG_H
#include <qdialog.h>
#include <qlineedit.h>
#include <qlayout.h>
#include <qvalidator.h>
#include <qpushbutton.h>
//Added by qt3to4:
#include <Q3GridLayout>
#include "jl_vectors.h"
class RangeDialog : public QDialog {
Q_OBJECT
public:
RangeDialog(QWidget *parent, int lowVal, int highVal);
Vec2i getRange() const;
~RangeDialog() {
delete lowEdit; delete highEdit; delete lay;
}
private:
QLineEdit *lowEdit, *highEdit;
Q3GridLayout* lay;
QPushButton *_ok, *_cancel;
};
Verfasst: 30. Juni 2009 17:32
von solarix
Aber dann müsste einen Fehler direkt in RangeDialog liegen.
Nicht unbedingt... der Fehler kann in beliebig vorher ausgeführtem Code liegen. Falls der Fehler von Auge nicht gefunden werden kann, hilft evt. "valgrind".
Einiges des gezeigten Codes würde ich zwar anderst machen (so sind z.B. die deletes im DTor unnötig), aber daraus sollte kein Fehler resultieren.. Besteht die Chance, dass du das Projekt auf Demogrösse (für uns) verkleinerst?
[EDIT]
So aus reiner Neugierde... das ist doch ein (von Qt3) portiertes Qt 4.x-Projekt.. oder? Was für ein "add()" wird denn bei "layout()->add(lowEdit);" aufgerufen? Ab Q4.0 hat QLayout doch gar keine add()-Methode mehr...?
Verfasst: 30. Juni 2009 18:21
von oracle
solarix hat geschrieben:Aber dann müsste einen Fehler direkt in RangeDialog liegen.
Nicht unbedingt... der Fehler kann in beliebig vorher ausgeführtem Code liegen. Falls der Fehler von Auge nicht gefunden werden kann, hilft evt. "valgrind".
ok, merci.
Einiges des gezeigten Codes würde ich zwar anderst machen (so sind z.B. die deletes im DTor unnötig), aber daraus sollte kein Fehler resultieren.. Besteht die Chance, dass du das Projekt auf Demogrösse (für uns) verkleinerst?
Ja, der Code ist auch nicht direkt von mir. Trotzdem, bis anhin hat alles bestens funktioniert.
So aus reiner Neugierde... das ist doch ein (von Qt3) portiertes Qt 4.x-Projekt.. oder? Was für ein "add()" wird denn bei "layout()->add(lowEdit);" aufgerufen? Ab Q4.0 hat QLayout doch gar keine add()-Methode mehr...?
Ja ist von QT3 auf QT4. Habe nun add durch addWidget ersetzt, ändert aber nichts am Ganzen.
Ich denke inzwischen das Problem liegt nicht direkt bei den oben gezeigten Programmzeilen.
Wenn ich z.b. an der Stelle wo ich bis anhing das getRange aufgerufen habe folgendes einfüge:
Code: Alles auswählen
/* which layer */
QDialog * dia = new QDialog();
QGridLayout *layout = new QGridLayout();
layout->setColumnStretch(1, 1);
layout->setColumnMinimumWidth(1, 250);
QComboBox * combo = new QComboBox();
layout->addWidget(combo,0,0);
dia->setLayout(layout);
dia->show();
klappt alles wunderbar.
Wenn ich allerdings die letzte Zeile durch dia->exec(); ersetze erzeugt es den selben Error wie oben beschrieben!
Verfasst: 1. Juli 2009 09:04
von solarix
Trotzdem, bis anhin hat alles bestens funktioniert.
Es ist schon möglich, dass sich der Fehler erst kürzlich eingeschlichen hat.. aber genauso gut ist es möglich, dass der Fehler schon lange drin ist, aber erst jetzt (aufgrund von Codeänderungen an einer anderen Stelle) im Programm tatsächlich Auswirkung hat.
Wenn ich allerdings die letzte Zeile durch dia->exec(); ersetze erzeugt es den selben Error wie oben beschrieben!
Du meinst, du rufst nichts aus dem bisher gezeigten Code auf, sondern nur das letzte Stückchen? Falls ja hast du tatsächlich den Beweis, dass der Fehler sonstwo liegt. Da hilft nur entweder
- das Projekt stückchenweise zu reduzieren und so den Fehler eingrenzen, oder
- ein Analyzer wie "valgrind" einsetzen
viel Glück!