从主窗口的菜单向 qt tabWidget 发送文件名

Posted

技术标签:

【中文标题】从主窗口的菜单向 qt tabWidget 发送文件名【英文标题】:Sending a file name to a qt tabWidget from main window's menu 【发布时间】:2015-04-30 19:17:06 【问题描述】:

我正在使用 qt 构建具有多个选项卡的文件编辑器,每个选项卡对应一个文件。在 mainwindow.cpp 我有这个功能:

    void MainWindow::on_actionOpen_triggered()
    

        QString fileName = QFileDialog::getOpenFileName(this,"Open File","/home",tr("*.ext"));
    

我需要将 fileName 发送到我的选项卡小部件的新选项卡。我知道 qt 中有类的信号和插槽,但我一生都无法弄清楚如何将 QString 发送到特定选项卡。有没有办法将文件名发送到选项卡的创建事件,或者可能使用选项卡的索引来发送信号?

我对 qt 很陌生,但我很确定这应该是一个简单的过程。我就是想不通。

提前致谢!

编辑:完全修改后的代码,两者都作为主窗口的成员:

void MainWindow::on_actionOpen_triggered()
    
    if (fileName!=NULL)
        
        int curtab=ui->fileTabWidget->addTab(new my_editor,tr("editor"));
        ui->fileTabWidget->setCurrentIndex(curtab);
        
    

所以遵循@vizhanyolajos 的指示;如果我将文件名传递到 addTab 的末尾,我需要在哪里添加其余代码以接收它?

我假设在我的自定义编辑器类中。

【问题讨论】:

有很多方法。你能添加你的标签创建代码吗? @deW1 在上面添加。如果你也想要类声明,请告诉我。 【参考方案1】:

您的代码可能如下所示:

void MainWindow::on_actionOpen_triggered()

    QString fileName = QFileDialog::getOpenFileName(this,"Open File","/home",tr("*.ext"));

    createNewPage( index , name , fileName );



createNewPage( int index , QString name , QString fileName )

    // your page creation code goes here
    // your fileOpen and fill textBox code goes here where you can use the fileName for it

我建议您将 pageIndex + fileName 存储在容器中,以便您可以轻松查询哪个页面对应于哪个文件。


void MainWindow::on_actionOpen_triggered()

    QString fileName = QFileDialog::getOpenFileName(this,"Open File","/home",tr("*.ext"));

    if (fileName!=NULL)
    
        ui->fileTabWidget->addTab(new my_editor( fileName ),tr("editor"));
        ui->fileTabWidget->setCurrentIndex(curtab);
    
 

只需将fileName 传递给my_editor 小部件的构造函数即可。 在那里,您可以调用您的函数,然后用 fileName 填充您的编辑器。

【讨论】:

@MoffD 更新了我的帖子。如果还有其他不清楚的地方,请告诉我。 感谢帮助,我使用了 vizhanyolajos 的 addTab(/*class data*/, fileName) 方法【参考方案2】:

没有标签创建事件。您需要执行以下步骤,我认为您不需要任何 SIGNAL/SLOT 机制。我认为您在问题中包含的 SLOT 是您 QMainWindow 的成员函数。而且我认为您的 QTabWidget 也是您的 QMainWindow 的一部分,因此您只需要这样做:

void onActionTriggered()

    const QString filename = // ...

    ui.TabWidget->addTab( /* Your custom class derived from QWidget or a Qt widget */, filename );

【讨论】:

我很确定这就是我所需要的,然后我只需设置类以使该额外参数正确吗? 在您修改的代码中,您应该将 (fileName != NULL ) 更改为之前使用的 QString fileName = QFileDialog::getOpenFileName( ... ) 然后检查是否 ( !fileName.isEmpty() )。之后将该文件名作为第二个参数传递给 addTab( ... )。如果您的自定义小部件还需要文件名,那么也将它传递给它 new my_editor(fileName)。

以上是关于从主窗口的菜单向 qt tabWidget 发送文件名的主要内容,如果未能解决你的问题,请参考以下文章

qt中用tcp发送Qtablewidget中的数据

Qt5 强制 TabWidget 在窗口大小更改时调整大小

qt把子窗口放进父窗口的widget里

如何使用 pyqt5 和 qt 设计器从主对话框窗口打开第二个窗口

C/C++ Qt Tree与Tab组件实现分页菜单

QT/QML 从主窗口重新打开新窗口