• 8312阅读
  • 10回复

[提问]大家看看这个要求合理吗? [复制链接]

上一主题 下一主题
离线wjz2047
 

只看楼主 倒序阅读 楼主  发表于: 2014-12-23
       上头要我开发一个可执行程序(也就是一个exe),不要带界面,但是运行时要蹦出一个选择对话框(这时又要带界面了),供用户选择文件
我本来想写个qt console application,发现不能直接调用QFileDialog。代码如下
  1. #include <QtCore/QCoreApplication>
  2. #include <QStringList>
  3. #include <QFileDialog>
  4. int main(int argc, char *argv[])
  5. {
  6.     QCoreApplication a(argc, argv);
  7.     QStringList imagelist = QFileDialog::getOpenFileNames(NULL,"Select MultiImages",".","Image Files(*.jpg *.png)");
  8.     return a.exec();
  9. }

会提示“cannot create a qwidget when no gui is being used”
请问这个需求合理吗?如何合理,我应该怎么做呢?
离线兴海北路

只看该作者 1楼 发表于: 2014-12-23
我曾经也遇到过这样类似的需求,当时就是写一个界面类,在构造函数里写一个浏览文件的函数,在这个函数里写上“QString fileName = QFileDialog::getOpenFileName(m_parentWidget, tr("打开shp文件"),
        /*tr(fileHome)*/".",tr("Shp (*.shp)"));”

m_parentWidget是父窗口的指针. 在主程序里 只是构造界面类,但是不调用exec函数。
离线dosmlp

只看该作者 2楼 发表于: 2014-12-23
你可以新建一个界面程序,然后把除主函数外的东西都删掉,然后就可以加入对话框了
离线roywillow

只看该作者 3楼 发表于: 2014-12-23
console应用是没有gui和widgets模块的,所以不会有任何对话框
应该还是得用gui应用,main中调用QFileDialog::getXXX,然后想办法让QApplication的quitOnLastWindowClosed(是这个吧)取消掉,免得点了确定之后程序就退出了,之后就正常程序逻辑就好了吧
只是单纯的构思,靠不靠谱还有待实现
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 4楼 发表于: 2014-12-23
要求是否合理不清楚。因为你的描述太模糊,不知道你上头的要求到底什么。

首先,Windows系统下的程序,在链接时,可以选择 console 或 windows 子系统。双击启动时,前者有控制台界面,后者没有。

但是和两个子系统和 程序是否带界面没有必然关系。 前者可以有GUI界面,后者也可以没有GUI界面。
离线wjz2047

只看该作者 5楼 发表于: 2014-12-23
回 roywillow 的帖子
roywillow:console应用是没有gui和widgets模块的,所以不会有任何对话框
应该还是得用gui应用,main中调用QFileDialog::getXXX,然后想办法让QApplication的quitOnLastWindowClosed(是这个吧)取消掉,免得点了确定之后程序就退出了,之后就正常程序逻辑就好了吧
只是单纯的构思,靠不靠谱 .. (2014-12-23 20:55) 

我现在建立一个GUI应用,主要代码如下:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyClass w;
                   //w.show();
    w.reconstruction();
    return a.exec();
}
其中class MyClass : public QMainWindow,我注释了w.show()函数,这样主程序就没界面,我在
reconstruction函数中实现了QFileDialog。但是这样导致一个问题:主函数运行完毕,程序不会自动退出,这可怎么办好?
离线stlcours

只看该作者 6楼 发表于: 2014-12-23
这算什么问题。用户选择完以后,把主界面和选择界面一起隐藏就是了。
离线roywillow

只看该作者 7楼 发表于: 2014-12-23
回 wjz2047 的帖子
wjz2047:我现在建立一个GUI应用,主要代码如下:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
....... (2014-12-23 22:53) 

想让程序退出的话调用一下qApp->quit()?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 8楼 发表于: 2014-12-23
主程序执行完,必然会退出。如果不退出,则说明没执行完。

另外,你应该知道你这儿的 a.exec() 和 Qt中其他 exec() 一样,都是一个 while(true) 循环吧?
离线cahwxy

只看该作者 9楼 发表于: 2014-12-24
显示带界面的程序,隐藏就可以了
离线cycloneii

只看该作者 10楼 发表于: 2014-12-31
我建议你可以在程序中加一个命令行参数,带了该参数的程序是gui程序,弹出菜单供用户选择,不带该参数的时候是console程序,这样,你在运行时需要“选择对话框”时,用system或者qprocess的方法加参数调用自身,两个实例之间可以通过命名管道或者共享内存之类的通信,获取用户选择的结果。
int main(int argc, char* argv[])
{
    if (argc ==2 && strcmp(argv[1], "--gui") == 0)
    {
        QApplication app(argc, argv);
        ......
    }
   else
   {
       QCoreApplication app(argc, argv);
       ......    
   }

    return 0;
}
快速回复
限100 字节
 
上一个 下一个