【问题标题】:qt share variables between slotsqt 在插槽之间共享变量
【发布时间】:2020-06-22 15:21:25
【问题描述】:

我无法弄清楚如何跨插槽使用变量。我已经多次阅读信号和插槽页面,但无法准确弄清楚如何使用连接功能。我试图用一个按钮来选择目录,然后在我点击打印时将其发送到另一个插槽,以便它可以使用该目录。感谢您的帮助。

void MainWindow::on_pushButton_clicked()
{
QApplication app(int argc, char** argv());
int n = 107;

for (int q = 1; q <= n; q++)
{
        QString fileName =(folderName + "/batch_%1.jpg").arg(q);
        // QPrinter printer;
        //QPrintDialog *dlg = new QPrintDialog(&printer,0);
        //if(dlg->exec() == QDialog::Accepted) {
        QPrinter printer(QPrinter::HighResolution);
        printer.setResolution(300);
        printer.setCopyCount(1);
        printer.setDoubleSidedPrinting(false);
        printer.setDuplex(QPrinter::DuplexNone);
        printer.setColorMode(QPrinter::Color);
        printer.setPageSize(QPrinter::Letter);
        printer.setPaperSize(QPrinter::Letter);
        printer.setPaperSource(QPrinter::Auto);
        printer.setOrientation(QPrinter::Portrait);
        printer.setPageMargins(0.0, 0.0, 0.0, 0.0, QPrinter::Inch);
        QString outputFileName = QStringLiteral("/Users/alexdotzler/Desktop/testing/test%1.pdf").arg(q);
        printer.setOutputFileName(outputFileName);
                printer.setOutputFormat(QPrinter::PdfFormat);
                QImage img(fileName);
                QPainter painter(&printer);
                painter.drawImage(QPoint(0,0),img);
                painter.end();
        }

        //delete dlg;

}

void MainWindow::on_pushButton_2_clicked()

{

QString folderName = QFileDialog::getExistingDirectory(0, ("Select file"), QDir::currentPath());


}

【问题讨论】:

    标签: qt qstring


    【解决方案1】:

    首先,请记住Minimal reproducible example。这不仅关乎示例,还关乎minimal。在这种情况下,您的打印代码是不必要的。

    根据您的问题,slot 只是类的一个功能。在您的情况下,您可以创建打印功能,该功能将从按钮 1 和 2 调用。

    另外,不要等待来自 sig/slots 的真正魔法。看起来像,但不是。连接槽到信号只是函数 A 调用时对函数 B 的虚拟调用。

    那么让我们深入了解一下信号和插槽的世界。

    1. 您可以将(插槽或信号)连接到信号。没有其他办法。
    2. 基本上,信号和槽用于在不同对象之间传递数据或通知它们某些事情。

    // foo.h
        class First {
    ...
    signals:
        void newData(QVariant val);
    };
    
    // bar.h
        class Another {...
    public slots:
        void getNewData(QVariant val);
    };
    
    // main.cpp
    Another another1;
    First first1;
    QObject::connect(first1, &First::newData, another1, &Another::getNewData);
    
    1. 当信号[Another::sig1]连接到[Third::sig2],它连接到信号[Fourth::sig3]和槽[Fifth::slot1]时,你也可以创建一个叫做“连接树”的东西], 等等。我不确定是否有人真的需要它,但可以随意玩。
    2. AFAIK,在单个类中使用信号/槽连接的唯一原因是,当您需要从 GUI 中运行的另一个线程向 GUI 线程传递一些数据时。请不要在实际项目中这样做。

    【讨论】:

      【解决方案2】:

      使folderName 成为MainWindow 类的成员,以便您的按钮单击插槽可以访问它。然后,您可以根据需要从这些插槽中读取/写入它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-09
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        • 2022-08-14
        相关资源
        最近更新 更多