【问题标题】:Qt Command Log using QListWidget使用 QListWidget 的 Qt 命令日志
【发布时间】:2019-08-12 21:46:57
【问题描述】:

我正在尝试在用户界面上构建命令日志。意思是,当用户单击按钮、选中复选框、上传一些图像等时,基本上每次用户与用户界面交互时,操作都会记录在如下所示的QListWidget 命令日志中。基本上这就是用户运行它时 ui 的外观:

这就是每次用户与 ui 交互时我尝试实现的目标:

下面是构造函数的sn-ps代码:

ma​​inwindow.h

private:
    QListWidget *mNewTextSQLLog;

ma​​inwindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mDockWidget_A = new QDockWidget(QLatin1String("Command Log"));
    mDockWidget_A->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    mDockWidget_A->setMinimumHeight(30);
    // Adding object to the DockWidget
    mNewText = new QListWidget;
    mNewText->setStyleSheet("background-color: light grey;");
    mNewText->setMinimumHeight(50);
    mNewText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    mDockWidget_A->setWidget(mNewText);
    addDockWidget(Qt::BottomDockWidgetArea, mDockWidget_A);
    resizeDocks({mDockWidget_A}, {200}, Qt::Horizontal);
}

然后是 ui 的一些命令,例如这里是当用户使用QPushButton 上传图像并且图像也显示在QLabel 上时:

void MainWindow::imageOriginlUploadB()
{
    dir_Original_B = QFileDialog::getExistingDirectory(this, tr("Choose an image directory to load"),
                                                     filesListRight, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
    if(dir_Original_B.length() > 0){
        QImage image;
        QDir dirBObj(dir_Original_B);
        QStringList filesListRight = dirBObj.entryList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden  | QDir::AllDirs | QDir::Files, QDir::DirsFirst);
        ui->labelOrigImageB->setPixmap(QPixmap::fromImage(image.scaled(125,125,Qt::KeepAspectRatio,Qt::SmoothTransformation)));
        for ( int i = 0 ; i < filesListRight.size() ; i++ )
        {
            ui->listWidgetOriginalImgB->addItem(filesListRight.at(i));
        }
        ui->listWidgetOriginalImgB->update();
        ui->labelOrigImageB->show();
    }
}


void MainWindow::on_originalmgB_clicked()
{
    imageOriginlUploadB();
}

或者这里是使用QPushButton调整QGraphicsView的大小:

void MainWindow::on_fitViewBtn_clicked()
{
    ui->graphicsViewLX->fitInView(mLeftScene->sceneRect(), Qt::KeepAspectRatio);
    ui->graphicsViewRX->fitInView(mRightScene->sceneRect(), Qt::KeepAspectRatio);
}

这是QCheckBox的激活:

void MainWindow::on_checkBoxScreen_A_toggled(bool checked)
{
    if(ui->checkBoxScreen_A->isEnabled()) {
        if(checked)
        {
            ui->checkBoxScreen_A->setText("Active");
            ui->saveToFile_A->setEnabled(true);
            ui->saveToFile_A->setStyleSheet("QPushButton{ background-color: green }");
        }
        else {
            ui->checkBoxScreen_A->setText("Inactive");
            ui->saveToFile_A->setEnabled(false);
            ui->saveToFile_A->setStyleSheet("QPushButton{ background-color: grey }");
        }
    }
}

如何做到这一点? 非常感谢您指出正确的方向

【问题讨论】:

    标签: c++ c++11 qt5 qlistwidget qcheckbox


    【解决方案1】:

    我认为QListWidget 不是用于命令日志的正确小部件——您可能希望使用QPlainTextEditQTextEdit 来代替。 (两者之间的主要difference 是QPlainTextEdit 针对显示大量文本进行了优化,代价是不支持QTextEdit 提供的一些更高级的文本格式功能)

    一旦您创建了这两个小部件中的一个,在日志底部添加文本只需在每次要添加另一行日志时在小部件上调用appendPlainText()(或append())-文本。

    除非您希望允许用户编辑命令日志中的文本,否则在小部件上调用setReadOnly(true) 也是一个好主意。

    (如果您还希望日志视图自动滚动到底部以便新添加的文本可见,您也可以在添加文本后调用myCommandLogWidget-&gt;verticalScrollBar()-&gt;setValue(myCommandLogWidget-&gt;verticalScrollBar()-&gt;maximum());

    【讨论】:

    • @Jeremy Friesner,感谢您非常详细的回答。在命令日志中,我计划使用一些图标为用户提供正面或负面的反馈,以获得视觉帮助like this。在我的设计中,我计划用至少 7/10 个图标来帮助用户。
    • 但同时我也在尝试考虑速度。我的意思是当用户决定上下滚动时,命令日志应该花费很长时间,尤其是当有图标时。
    • 也感谢for this。这个项目的最佳选择似乎是使用QTextEdit。非常感谢您的澄清:)
    • 请注意,这两个小部件中的任何一个都支持 Unicode,因此如果您需要的图标可用作 Unicode 字符,则可以使用其中一个。 (请参阅unicode.org/emoji/charts/full-emoji-list.html 以获取 Unicode 中可用的一些图标示例)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2013-08-22
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多