• 6588阅读
  • 7回复

Mainwindow窗体的系列问题讨论。 [复制链接]

上一主题 下一主题
离线keimaoqi
 
只看楼主 倒序阅读 楼主  发表于: 2009-09-04
我以前是拿mfc做程序的,最近想试试QT  于是下载了4.5.2版本和一个add-in-vs装起来,和vc2008配合使用。

界面编程确实方便,以前mfc要实现一个菜单添加图标还得建个Class,还得整好多行复杂的代码。QT一拖就完成了,确实帅呀。

可是当我满意的把界面用designer做完后,傻眼了,简单的菜单消息响应半天搞不定。信号和槽的相关内容我也看了一些,可那些都是些支离破碎的小代码段,帮不了我忙。

所以希望论坛的大大们能帮帮我忙:
我再解决方案属性页中看到的是这么几个文件:
①***.ui,对应的是个ui_***.h的文件,声明和定义都在这个文件中,不知道为什么没有对应的cpp文件。可以用designer更改,也可以直接更改,但是手动更改的代码往往会在designer那边改过之后又还原掉了。
②两个moc打头的名字一摸一样的cpp文件,不知道是干啥的,没动过。qrc打头的cpp文件,打开全是16进制的数,没动过。
③***.h文件,vc项目的东西,比较熟悉,但是不知道在这个QT建立起来的工程中,能起到什么作用,功能函数是在这里声明吗?
④***.qtr 这个简单,就是把要包含进工程的图片图标等资源的路劲加进来。
⑤main.cpp 和***.cpp:这两个文件哪个是处理功能函数的? main.cpp一般不动他吗?

connect()函数是应该加在哪个文件里,哪个函数里?
比如我想点某个菜单弹出个message窗口,具体如何做?
离线duduqq

只看该作者 1楼 发表于: 2009-09-04
你建一个类的时候不是创建了一个.cpp和 .h文件吗,还有.ui文件,编译时.ui文件会生成ui_***.h文件的,所以你改动ui_***.h文件是没有用的,它编译时还是从.ui得来。你要改代码就得在.cpp和.h里面改,.h文件include了ui_***.h文件,然后new 了一个m_ui,所以界面里的控件全都从m_ui里面得到,例如要更改一个按钮的位置,可以这样:
m_ui->pushButton->move(100,200) ;

不过我是在Linux下用的,在windows上没有安装好QT,不知怎样把QT和VC配合起来用,有空请你指导一下。
离线dbzhang800

只看该作者 2楼 发表于: 2009-09-04
建议楼主先找点Qt的资料看看。一些概念弄清楚再说
离线keimaoqi
只看该作者 3楼 发表于: 2009-09-04
多谢2楼的兄弟, 我是在32位xp sp3上安装的,其实也很简单:下载解压qt-win-opensource-src-4.5.2到某一个文件夹,添加administrator环境变量,然后用vs的命令提示行进入这个文件夹,运行 configure -platform win32-msvc2008 -debug-and-release  ,等个几分钟后 输入nmake编译几个小时后,nmake confclean 清理,最后安装qt-vs-addin 。然后进vc2008就能新建QT应用程序了,同时菜单选项里也多了个QT,可以直接调designer。

我在***.cpp里类的构造函数里  加了一句 QObject::connect(ui.Load_image_s_, SIGNAL(triggered()), this, SLOT(on_Load_image_s__triggered()));

然后自己声明定义了on_Load_image_s__triggered()函数,函数体实现部分就是QMessageBox::information(),然后运行程序后,菜单栏点击还是没啥反应,不知道是我哪个概念不对,还是哪弄错了?
离线duduqq

只看该作者 4楼 发表于: 2009-09-04
运时有没有什么出错的信息显示出来,要不你把代码贴上来看看
离线keimaoqi
只看该作者 5楼 发表于: 2009-09-08
Myview::Myview(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
    QObject::connect(ui.Load_image_s_, SIGNAL(triggered()), this, SLOT(on_Load_image_s__triggered()));
    QPixmap* pm = new QPixmap(":/Myview/Resources/image.bmp");
        QGraphicsScene* gs = new QGraphicsScene();
        gs->addPixmap(*pm);
        ui.graphicsView->setScene(gs);

}


void Myview::on_Load_image_s__triggered()
{
    int ret = QMessageBox::information(this, tr("heihei"),
                         tr("About to quit !\n"
                            "Do you want to save the changes before exiting?"),                        
                         tr("Save changes"),
                         tr("Discard changes"),
        tr("Cancel"),
        QMessageBox::Yes,
                         QMessageBox::Cancel | QMessageBox::Escape);
             if (ret == QMessageBox::Cancel)
                return ;
}
离线keimaoqi
只看该作者 6楼 发表于: 2009-09-10
几天没来,也没人回答,我自己搞定了。
原因还是出在我用mfc编程的习惯上,阅读文档时也马马虎虎

没看到这一句:所有的槽函数都必须申明public slots语句内

我是直接申明在public下了,呵呵,当然没反应了。
离线wd007

只看该作者 7楼 发表于: 2009-12-05
楼上自己解决的,不错。

但是槽函数不是一定要声明为public slots:的,private slots:也可,尽量不要使用protected就是了。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
快速回复
限100 字节
 
上一个 下一个