Seite 1 von 1

QChekBox Problem

Verfasst: 12. September 2006 21:27
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.

Verfasst: 12. September 2006 21:43
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-

Verfasst: 12. September 2006 21:48
von Karldin Shinowa
Trennung der Implementierung und der klassendefinition is zwingend???

Verfasst: 12. September 2006 21:59
von rmeeh
Ja, die Trennung ist laut meiner Dokumentation vom MOC zwingend
-Ralf-

Verfasst: 12. September 2006 22:11
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