今天是Qt的第一天,越到了很多的问题,不过还好都已经解决了。下面记录一下:
qt incomplete type
这个问题,我刚遇到的时候,以后是自己疏忽没有写好code,后来去参考demo程序,发现自己没有错误。不错那个提示却一再的出现。于是,google,百度都试了。
后来看到了一个说明,现在我也不知道是那个了。大概如下:
#include <QDialog>
#include <QTextEdit>在头文件中引用了其他的class的话,若写成:
class QDialog;
class QTextEdit;
那么就会出现路上的错误提示。
现在还没知道为什么?
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
之后就是使用designer设计了多个ui文件,怎么把他们连在一起的问题。为了从一个ui中取数据到另一个ui文件按中,我纠结了半天,不过现在解决了。
qt自动生成的Dialog是把ui对应的class的对象作为主窗口或主Dialog的一个成员。那个在对ui的设计应用到这个窗体上时就使用了这个对象的setupUi方法。
那么在另一个地方需要绘制新的窗体是,就使用新的ui对应的class的对象来调用setupUi方法。
如果你在自定义class时是继承自这个ui的class那个就可以直接重新实现setupUi方法。
看code
#ifndef STANDARDDIALOG_H
#define STANDARDDIALOG_H
#include <QDialog>
#include <ui_showAllDialog.h>
#include <QTextEdit>
class QDialog;
class QTextEdit;
#include "showinfo.h"
namespace Ui {
class StandardDialog;
}
class StandardDialog : public QDialog
{
Q_OBJECT
public:
explicit StandardDialog(QWidget *parent = 0);
~StandardDialog();
private:
Ui::StandardDialog *ui1;
Ui::showAllDialog *ui2;
QDialog *all;
showInfo *showallinfo;
private slots:
void setSex();
void setName();
void setAge();
void setStature();
void showAll();
};
#endif // STANDARDDIALOG_H
#include <QInputDialog>
#include <QMessageBox>
#include "standarddialog.h"
#include "ui_standarddialog.h"
StandardDialog::StandardDialog(QWidget *parent) :
QDialog(parent),
ui1(new Ui::StandardDialog)
{
ui1->setupUi(this);
connect(ui1->quitapp,SIGNAL(clicked()),this,SLOT(close()));
connect(ui1->sexSetButton,SIGNAL(clicked()),this,SLOT(setSex()));
connect(ui1->nameSetButton,SIGNAL(clicked()),this,SLOT(setName()));
connect(ui1->ageSetButton,SIGNAL(clicked()),this,SLOT(setAge()));
connect(ui1->statureSetButton,SIGNAL(clicked()),this,SLOT(setStature()));
connect(ui1->showAllButton,SIGNAL(clicked()),this,SLOT(showAll()));
}
StandardDialog::~StandardDialog()
{
delete ui1;
}
void StandardDialog::setSex()
{
QStringList list;
list<<tr("male")<<tr("famale");
bool ok;
QString sex = QInputDialog::getItem(this,tr("Sex"),tr("please choose sex:"),list,0,false,&ok);
if(ok){
ui1->sexlineEdit->setText(sex);
}
}
void StandardDialog::setName()
{
bool ok;
QString name = QInputDialog::getText(
this,tr("UserName"),tr("please enter name:")
,QLineEdit::Normal,ui1->namelineEdit->text(),&ok);
if(ok && !name.isEmpty()){
ui1->namelineEdit->setText(name);
}
}
void StandardDialog::setAge()
{
bool ok;
int age = QInputDialog::getInteger(this,tr("User age"),tr("please enter age:"),ui1->agelineEdit->text().toInt(),0,150,1,&ok);
if(ok){
ui1->agelineEdit->setText(QString(tr("%1")).arg(age));
}
}
void StandardDialog::setStature()
{
bool ok;
double d = QInputDialog::getDouble(this,tr("stature"),tr("please enter your stature:"),170.00,0,200.00,1,&ok);
if(ok){
ui1->staturelineEdit->setText(QString(tr("%1")).arg(d));
}
}
void StandardDialog::showAll()
{
showallinfo = new showInfo;
QString str = tr("Name:")+ui1->namelineEdit->text()+tr("\n")+
tr("Sex:")+ui1->sexlineEdit->text()+tr("\n")+
tr("Age:")+ui1->agelineEdit->text()+tr("\n")+
tr("Stature:")+ui1->staturelineEdit->text()+tr("\n");
//QString str = tr("Name:")+ui1->namelineEdit->text();
showallinfo->setInfo(str);
showallinfo->viewTextInfo();
showallinfo->show();
}
#ifndef SHOWINFO_H
#define SHOWINFO_H
#include <QDialog>
#include <QString>
#include "ui_showAllDialog.h"
class showInfo : public QDialog,Ui::showAllDialog
{
Q_OBJECT
public:
explicit showInfo(QWidget *parent = 0);
QString getInfo();
void setInfo(const QString &str);
void viewTextInfo();
private:
QString info;
signals:
public slots:
};
#endif // SHOWINFO_H
对于在ui之间传值的问题。我使用的是继承那个ui的class,在重新实现setupUi方法,同时初始化connect关系,即就是在构造函数中完成。那么对于从一个ui中取数据,我使用了自定义的成员函数来进行,看代码:#include "showinfo.h"
showInfo::showInfo(QWidget *parent) :
QDialog(parent)
{
setupUi(this);
connect(this->quitButton,SIGNAL(clicked()),this,SLOT(hide()));
}
void showInfo::setInfo(const QString &str)
{
this->info = str;
}
QString showInfo::getInfo()
{
return this->info;
}
void showInfo::viewTextInfo()
{
textBrowser->setText(this->getInfo());
}
调用部分:
void StandardDialog::showAll()
{
showallinfo = new showInfo;
QString str = tr("Name:")+ui1->namelineEdit->text()+tr("\n")+
tr("Sex:")+ui1->sexlineEdit->text()+tr("\n")+
tr("Age:")+ui1->agelineEdit->text()+tr("\n")+
tr("Stature:")+ui1->staturelineEdit->text()+tr("\n");
//QString str = tr("Name:")+ui1->namelineEdit->text();
showallinfo->setInfo(str);
showallinfo->viewTextInfo();
showallinfo->show();
}