QChekBox Problem

Alles rund um die Programmierung mit Qt
Antworten
Karldin Shinowa
Beiträge: 30
Registriert: 3. Mai 2006 18:12

QChekBox Problem

Beitrag von Karldin Shinowa »

Ich will 3 QCheckBoxes in nem Widget positionieren und es darf immer nur 1 angekreutzt sein. wenn keins is wird das 1. genommen. My is das HauptWidget, Box die Checkbox, BoxHandler wacht dass nur 1 angekreutzt is

Code: Alles auswählen

#include<QApplication>
#include<QWidget>
#include<QVBoxLayout>
#include<QCheckBox>

class BoxHandler;

class Box:public QCheckBox
{
	Q_OBJECT

   public:
		Box(BoxHandler** Handler,const QString & text,int num)
			:QCheckBox(text,0),num(num),Handler(Handler)
		{
          connect(this,SIGNAL(stateChanged(int)),this,SLOT(sendToHandler(int)));
      }
   
	public slots:
      void sendToHandler(int i);
      

	private:
      int num;
      BoxHandler**Handler;
};

class BoxHandler
{
   public:
      BoxHandler(int numOfBoxes, Box**boxes)
			:numOfBoxes(numOfBoxes),boxes(boxes)
		{}
      
		void setBox(int i)
      {
         switch(boxes[i]->checkState () )
         {
            case Qt::Unchecked:
				{
                boxes[0]->setCheckState(Qt::Checked);
				}break;

				case Qt::Checked:
				{
					for(int j=0;j<numOfBoxes;j++)
               {
                  if(j==i);
						else boxes[j]->setCheckState(Qt::Unchecked);
					}
				}break;
			}
		}      

   private:
     int numOfBoxes;
     Box**boxes;
};

void Box::sendToHandler(int i)
{
   (*Handler)->setBox(num);
}

class My:public QWidget
{
   public:
    My()
		:QWidget(0)
	{
      BoxHandler** Handler=new BoxHandler*();
      Box**boxes=new Box*[3];
      boxes[0]=new Box(Handler,"a",0);
      boxes[0]->setCheckState(Qt::Checked);
		boxes[1]=new Box(Handler,"b",1);
		boxes[2]=new Box(Handler,"c",2);
      *Handler=new BoxHandler(3,boxes);

      QVBoxLayout*layout=new QVBoxLayout;
      layout->addWidget(boxes[0]);
	   layout->addWidget(boxes[1]);
	   layout->addWidget(boxes[2]);

      setLayout(layout);
      
   }
};


   
     
int main(int argc, char*argv[])
{
   QApplication*app=new QApplication(argc,argv);
   My my;
   my.show();
   
   app->exec();
}
So jetzt kommt:
MSVCRTD.lib(cinitexe.obj) : warning LNK4098: Standardbibliothek "libcmtd.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.

main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual struct QMetaObject const * __thiscall Box::metaObject(void)const " (?metaObject@Box@@UBEPBUQMetaObject@@XZ)".

main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void * __thiscall Box::qt_metacast(char const *)" (?qt_metacast@Box@@UAEPAXPBD@Z)".

main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual int __thiscall Box::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Box@@UAEHW4Call@QMetaObject@@HPAPAX@Z)".

debug\qt2.exe : fatal error LNK1120: 3 nicht aufgelöste externe Verweise.

NMAKE : fatal error U1077: ""E:\Progen\Microsoft Visual Studio 8\VC\bin\link.EXE"": R³ckgabe-Code "0x460"
Stop.
NMAKE : fatal error U1077: ""E:\Progen\Microsoft Visual Studio 8\VC\bin\nmake.exe"": R³ckgabe-Code "0x2"
Stop.
Wer früher stirbt ist länger tot
rmeeh
Beiträge: 32
Registriert: 10. September 2006 18:59
Wohnort: Geislingen
Kontaktdaten:

Beitrag von rmeeh »

uuuuups,
das kommt mir sehr bekannt vor.....
Hier hat wohl der MOC was nicht oder in den falschen Hals gekriegt.
Passiert z.B. wenn der Klassenheader und die Implementierung nicht in 2 Dateien getrennt untergebracht sind. Sonst ist evtl. beim Erstellen des Makefile was schief gegangen. Diese Fehlermeldungen unter VS (allerdings Ver.6) werden bei mir prinzipiell durch Fehler beim MOC verursacht. Auch wenn der z.B. eine Datei gar nicht übersetzt hat.
-Ralf-
Kein Tag kommt wieder, vergessene Fehler schon....
Karldin Shinowa
Beiträge: 30
Registriert: 3. Mai 2006 18:12

Beitrag von Karldin Shinowa »

Trennung der Implementierung und der klassendefinition is zwingend???
Wer früher stirbt ist länger tot
rmeeh
Beiträge: 32
Registriert: 10. September 2006 18:59
Wohnort: Geislingen
Kontaktdaten:

Beitrag von rmeeh »

Ja, die Trennung ist laut meiner Dokumentation vom MOC zwingend
-Ralf-
Kein Tag kommt wieder, vergessene Fehler schon....
rmeeh
Beiträge: 32
Registriert: 10. September 2006 18:59
Wohnort: Geislingen
Kontaktdaten:

Beitrag von rmeeh »

Also ich habe nochmal nachgelesen. Es passiert wenn das Macro Q_OBJECT bearbeitet wird. Wenn Du danach vergisst das Makefile zu aktualisieren und MOC logischerweise nichts tut, oder wenn Header und Implementierung nicht getrennt sind. Weil: der von MOC erzeugte Code eben jene Header Datei plus einige imaginäre Extras enthält. Hat er eben jene Header Datei nicht, weil Du alles in die implementierung gepackt hast, läuft er nicht korrekt drüber und jene Obskuren Fehlermeldungen sind die Folge.

Grüße Ralf
Kein Tag kommt wieder, vergessene Fehler schon....
Antworten