Merge "Merge remote-tracking branch 'origin/5.6' into 5.7" into refs/staging/5.7
This commit is contained in:
commit
ac9d19c986
@ -55,8 +55,8 @@ RasterWindow::RasterWindow(QWindow *parent)
|
||||
: QWindow(parent)
|
||||
, m_update_pending(false)
|
||||
{
|
||||
m_backingStore = new QBackingStore(this);
|
||||
create();
|
||||
m_backingStore = new QBackingStore(this);
|
||||
|
||||
setGeometry(100, 100, 300, 200);
|
||||
|
||||
|
@ -52,51 +52,72 @@
|
||||
|
||||
#include "window.h"
|
||||
|
||||
//! [17]
|
||||
enum { absoluteFileNameRole = Qt::UserRole + 1 };
|
||||
//! [17]
|
||||
|
||||
//! [18]
|
||||
static inline QString fileNameOfItem(const QTableWidgetItem *item)
|
||||
{
|
||||
return item->data(absoluteFileNameRole).toString();
|
||||
}
|
||||
//! [18]
|
||||
|
||||
//! [14]
|
||||
static inline void openFile(const QString &fileName)
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl::fromLocalFile(fileName));
|
||||
}
|
||||
//! [14]
|
||||
|
||||
//! [0]
|
||||
Window::Window(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
browseButton = new QPushButton(tr("&Browse..."), this);
|
||||
QPushButton *browseButton = new QPushButton(tr("&Browse..."), this);
|
||||
connect(browseButton, &QAbstractButton::clicked, this, &Window::browse);
|
||||
findButton = new QPushButton(tr("&Find"), this);
|
||||
connect(findButton, &QAbstractButton::clicked, this, &Window::find);
|
||||
|
||||
fileComboBox = createComboBox(tr("*"));
|
||||
connect(fileComboBox->lineEdit(), &QLineEdit::returnPressed,
|
||||
this, &Window::animateFindClick);
|
||||
textComboBox = createComboBox();
|
||||
directoryComboBox = createComboBox(QDir::currentPath());
|
||||
connect(textComboBox->lineEdit(), &QLineEdit::returnPressed,
|
||||
this, &Window::animateFindClick);
|
||||
directoryComboBox = createComboBox(QDir::toNativeSeparators(QDir::currentPath()));
|
||||
connect(directoryComboBox->lineEdit(), &QLineEdit::returnPressed,
|
||||
this, &Window::animateFindClick);
|
||||
|
||||
fileLabel = new QLabel(tr("Named:"));
|
||||
textLabel = new QLabel(tr("Containing text:"));
|
||||
directoryLabel = new QLabel(tr("In directory:"));
|
||||
filesFoundLabel = new QLabel;
|
||||
|
||||
createFilesTable();
|
||||
//! [0]
|
||||
|
||||
//! [1]
|
||||
QGridLayout *mainLayout = new QGridLayout;
|
||||
mainLayout->addWidget(fileLabel, 0, 0);
|
||||
QGridLayout *mainLayout = new QGridLayout(this);
|
||||
mainLayout->addWidget(new QLabel(tr("Named:")), 0, 0);
|
||||
mainLayout->addWidget(fileComboBox, 0, 1, 1, 2);
|
||||
mainLayout->addWidget(textLabel, 1, 0);
|
||||
mainLayout->addWidget(new QLabel(tr("Containing text:")), 1, 0);
|
||||
mainLayout->addWidget(textComboBox, 1, 1, 1, 2);
|
||||
mainLayout->addWidget(directoryLabel, 2, 0);
|
||||
mainLayout->addWidget(new QLabel(tr("In directory:")), 2, 0);
|
||||
mainLayout->addWidget(directoryComboBox, 2, 1);
|
||||
mainLayout->addWidget(browseButton, 2, 2);
|
||||
mainLayout->addWidget(filesTable, 3, 0, 1, 3);
|
||||
mainLayout->addWidget(filesFoundLabel, 4, 0, 1, 2);
|
||||
mainLayout->addWidget(findButton, 4, 2);
|
||||
setLayout(mainLayout);
|
||||
|
||||
setWindowTitle(tr("Find Files"));
|
||||
resize(700, 300);
|
||||
const QRect screenGeometry = QApplication::desktop()->screenGeometry(this);
|
||||
resize(screenGeometry.width() / 2, screenGeometry.height() / 3);
|
||||
}
|
||||
//! [1]
|
||||
|
||||
//! [2]
|
||||
void Window::browse()
|
||||
{
|
||||
QString directory = QFileDialog::getExistingDirectory(this,
|
||||
tr("Find Files"), QDir::currentPath());
|
||||
QString directory =
|
||||
QDir::toNativeSeparators(QFileDialog::getExistingDirectory(this, tr("Find Files"), QDir::currentPath()));
|
||||
|
||||
if (!directory.isEmpty()) {
|
||||
if (directoryComboBox->findText(directory) == -1)
|
||||
@ -112,14 +133,28 @@ static void updateComboBox(QComboBox *comboBox)
|
||||
comboBox->addItem(comboBox->currentText());
|
||||
}
|
||||
|
||||
//! [13]
|
||||
|
||||
static void findRecursion(const QString &path, const QString &pattern, QStringList *result)
|
||||
{
|
||||
QDir currentDir(path);
|
||||
const QString prefix = path + QLatin1Char('/');
|
||||
foreach (const QString &match, currentDir.entryList(QStringList(pattern), QDir::Files | QDir::NoSymLinks))
|
||||
result->append(prefix + match);
|
||||
foreach (const QString &dir, currentDir.entryList(QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot))
|
||||
findRecursion(prefix + dir, pattern, result);
|
||||
}
|
||||
|
||||
//! [13]
|
||||
//! [3]
|
||||
|
||||
void Window::find()
|
||||
{
|
||||
filesTable->setRowCount(0);
|
||||
|
||||
QString fileName = fileComboBox->currentText();
|
||||
QString text = textComboBox->currentText();
|
||||
QString path = directoryComboBox->currentText();
|
||||
QString path = QDir::cleanPath(directoryComboBox->currentText());
|
||||
//! [3]
|
||||
|
||||
updateComboBox(fileComboBox);
|
||||
@ -127,19 +162,21 @@ void Window::find()
|
||||
updateComboBox(directoryComboBox);
|
||||
|
||||
//! [4]
|
||||
|
||||
currentDir = QDir(path);
|
||||
QStringList files;
|
||||
if (fileName.isEmpty())
|
||||
fileName = "*";
|
||||
files = currentDir.entryList(QStringList(fileName),
|
||||
QDir::Files | QDir::NoSymLinks);
|
||||
|
||||
findRecursion(path, fileName.isEmpty() ? QStringLiteral("*") : fileName, &files);
|
||||
if (!text.isEmpty())
|
||||
files = findFiles(files, text);
|
||||
showFiles(files);
|
||||
}
|
||||
//! [4]
|
||||
|
||||
void Window::animateFindClick()
|
||||
{
|
||||
findButton->animateClick();
|
||||
}
|
||||
|
||||
//! [5]
|
||||
QStringList Window::findFiles(const QStringList &files, const QString &text)
|
||||
{
|
||||
@ -149,21 +186,26 @@ QStringList Window::findFiles(const QStringList &files, const QString &text)
|
||||
progressDialog.setWindowTitle(tr("Find Files"));
|
||||
|
||||
//! [5] //! [6]
|
||||
QMimeDatabase mimeDatabase;
|
||||
QStringList foundFiles;
|
||||
|
||||
for (int i = 0; i < files.size(); ++i) {
|
||||
progressDialog.setValue(i);
|
||||
progressDialog.setLabelText(tr("Searching file number %1 of %2...")
|
||||
.arg(i).arg(files.size()));
|
||||
qApp->processEvents();
|
||||
progressDialog.setLabelText(tr("Searching file number %1 of %n...", 0, files.size()).arg(i));
|
||||
QCoreApplication::processEvents();
|
||||
//! [6]
|
||||
|
||||
if (progressDialog.wasCanceled())
|
||||
break;
|
||||
|
||||
//! [7]
|
||||
QFile file(currentDir.absoluteFilePath(files[i]));
|
||||
|
||||
const QString fileName = files.at(i);
|
||||
const QMimeType mimeType = mimeDatabase.mimeTypeForFile(fileName);
|
||||
if (mimeType.isValid() && !mimeType.inherits(QStringLiteral("text/plain"))) {
|
||||
qWarning() << "Not searching binary file " << QDir::toNativeSeparators(fileName);
|
||||
continue;
|
||||
}
|
||||
QFile file(fileName);
|
||||
if (file.open(QIODevice::ReadOnly)) {
|
||||
QString line;
|
||||
QTextStream in(&file);
|
||||
@ -171,7 +213,7 @@ QStringList Window::findFiles(const QStringList &files, const QString &text)
|
||||
if (progressDialog.wasCanceled())
|
||||
break;
|
||||
line = in.readLine();
|
||||
if (line.contains(text)) {
|
||||
if (line.contains(text, Qt::CaseInsensitive)) {
|
||||
foundFiles << files[i];
|
||||
break;
|
||||
}
|
||||
@ -186,13 +228,18 @@ QStringList Window::findFiles(const QStringList &files, const QString &text)
|
||||
void Window::showFiles(const QStringList &files)
|
||||
{
|
||||
for (int i = 0; i < files.size(); ++i) {
|
||||
QFile file(currentDir.absoluteFilePath(files[i]));
|
||||
qint64 size = QFileInfo(file).size();
|
||||
|
||||
QTableWidgetItem *fileNameItem = new QTableWidgetItem(files[i]);
|
||||
const QString &fileName = files.at(i);
|
||||
const QString toolTip = QDir::toNativeSeparators(fileName);
|
||||
const QString relativePath = QDir::toNativeSeparators(currentDir.relativeFilePath(fileName));
|
||||
const qint64 size = QFileInfo(fileName).size();
|
||||
QTableWidgetItem *fileNameItem = new QTableWidgetItem(relativePath);
|
||||
fileNameItem->setData(absoluteFileNameRole, QVariant(fileName));
|
||||
fileNameItem->setToolTip(toolTip);
|
||||
fileNameItem->setFlags(fileNameItem->flags() ^ Qt::ItemIsEditable);
|
||||
QTableWidgetItem *sizeItem = new QTableWidgetItem(tr("%1 KB")
|
||||
.arg(int((size + 1023) / 1024)));
|
||||
sizeItem->setData(absoluteFileNameRole, QVariant(fileName));
|
||||
sizeItem->setToolTip(toolTip);
|
||||
sizeItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
||||
sizeItem->setFlags(sizeItem->flags() ^ Qt::ItemIsEditable);
|
||||
|
||||
@ -201,8 +248,7 @@ void Window::showFiles(const QStringList &files)
|
||||
filesTable->setItem(row, 0, fileNameItem);
|
||||
filesTable->setItem(row, 1, sizeItem);
|
||||
}
|
||||
filesFoundLabel->setText(tr("%1 file(s) found").arg(files.size()) +
|
||||
(" (Double click on a file to open it)"));
|
||||
filesFoundLabel->setText(tr("%n file(s) found (Double click on a file to open it)", 0, files.size()));
|
||||
filesFoundLabel->setWordWrap(true);
|
||||
}
|
||||
//! [8]
|
||||
@ -230,20 +276,43 @@ void Window::createFilesTable()
|
||||
filesTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
||||
filesTable->verticalHeader()->hide();
|
||||
filesTable->setShowGrid(false);
|
||||
|
||||
//! [15]
|
||||
filesTable->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(filesTable, &QTableWidget::customContextMenuRequested,
|
||||
this, &Window::contextMenu);
|
||||
connect(filesTable, &QTableWidget::cellActivated,
|
||||
this, &Window::openFileOfItem);
|
||||
//! [15]
|
||||
}
|
||||
//! [11]
|
||||
|
||||
|
||||
//! [12]
|
||||
|
||||
void Window::openFileOfItem(int row, int /* column */)
|
||||
{
|
||||
QTableWidgetItem *item = filesTable->item(row, 0);
|
||||
|
||||
QDesktopServices::openUrl(QUrl::fromLocalFile(currentDir.absoluteFilePath(item->text())));
|
||||
const QTableWidgetItem *item = filesTable->item(row, 0);
|
||||
openFile(fileNameOfItem(item));
|
||||
}
|
||||
|
||||
//! [12]
|
||||
|
||||
//! [16]
|
||||
void Window::contextMenu(const QPoint &pos)
|
||||
{
|
||||
const QTableWidgetItem *item = filesTable->itemAt(pos);
|
||||
if (!item)
|
||||
return;
|
||||
QMenu menu;
|
||||
QAction *copyAction = menu.addAction("Copy Name");
|
||||
QAction *openAction = menu.addAction("Open");
|
||||
QAction *action = menu.exec(filesTable->mapToGlobal(pos));
|
||||
if (!action)
|
||||
return;
|
||||
const QString fileName = fileNameOfItem(item);
|
||||
if (action == copyAction)
|
||||
QGuiApplication::clipboard()->setText(QDir::toNativeSeparators(fileName));
|
||||
else if (action == openAction)
|
||||
openFile(fileName);
|
||||
}
|
||||
//! [16]
|
||||
|
@ -73,7 +73,9 @@ public:
|
||||
private slots:
|
||||
void browse();
|
||||
void find();
|
||||
void animateFindClick();
|
||||
void openFileOfItem(int row, int column);
|
||||
void contextMenu(const QPoint &pos);
|
||||
|
||||
private:
|
||||
QStringList findFiles(const QStringList &files, const QString &text);
|
||||
@ -84,11 +86,7 @@ private:
|
||||
QComboBox *fileComboBox;
|
||||
QComboBox *textComboBox;
|
||||
QComboBox *directoryComboBox;
|
||||
QLabel *fileLabel;
|
||||
QLabel *textLabel;
|
||||
QLabel *directoryLabel;
|
||||
QLabel *filesFoundLabel;
|
||||
QPushButton *browseButton;
|
||||
QPushButton *findButton;
|
||||
QTableWidget *filesTable;
|
||||
|
||||
|
@ -120,10 +120,12 @@
|
||||
\snippet dialogs/findfiles/window.cpp 4
|
||||
|
||||
We use the directory's path to create a QDir; the QDir class
|
||||
provides access to directory structures and their contents. We
|
||||
create a list of the files (contained in the newly created QDir)
|
||||
that match the specified file name. If the file name is empty
|
||||
the list will contain all the files in the directory.
|
||||
provides access to directory structures and their contents.
|
||||
|
||||
\snippet dialogs/findfiles/window.cpp 13
|
||||
|
||||
We recursively create a list of the files (contained in the newl
|
||||
created QDir) that match the specified file name.
|
||||
|
||||
Then we search through all the files in the list, using the private
|
||||
\c findFiles() function, eliminating the ones that don't contain
|
||||
@ -173,9 +175,7 @@
|
||||
|
||||
\snippet dialogs/findfiles/window.cpp 7
|
||||
|
||||
After updating the QProgressDialog, we create a QFile using the
|
||||
QDir::absoluteFilePath() function which returns the absolute path
|
||||
name of a file in the directory. We open the file in read-only
|
||||
After updating the QProgressDialog, we open the file in read-only
|
||||
mode, and read one line at a time using QTextStream.
|
||||
|
||||
The QTextStream class provides a convenient interface for reading
|
||||
@ -194,9 +194,18 @@
|
||||
|
||||
Both the \c findFiles() and \c showFiles() functions are called from
|
||||
the \c find() slot. In the \c showFiles() function we run through
|
||||
the provided list of file names, adding each file name to the
|
||||
the provided list of file names, adding each relative file name to the
|
||||
first column in the table widget and retrieving the file's size using
|
||||
QFile and QFileInfo for the second column.
|
||||
QFileInfo for the second column. For later use, we set
|
||||
the absolute path as a data on the QTableWidget using the
|
||||
the role absoluteFileNameRole defined to be Qt::UserRole + 1.
|
||||
|
||||
\snippet dialogs/findfiles/window.cpp 17
|
||||
|
||||
This allows for retrieving the name of an item using a
|
||||
convenience function:
|
||||
|
||||
\snippet dialogs/findfiles/window.cpp 18
|
||||
|
||||
We also update the total number of files found.
|
||||
|
||||
@ -236,8 +245,19 @@
|
||||
|
||||
\snippet dialogs/findfiles/window.cpp 12
|
||||
|
||||
\snippet dialogs/findfiles/window.cpp 14
|
||||
|
||||
The \c openFileOfItem() slot is invoked when the user double
|
||||
clicks on a cell in the table. The QDesktopServices::openUrl()
|
||||
knows how to open a file given the file name.
|
||||
|
||||
\snippet dialogs/findfiles/window.cpp 15
|
||||
\snippet dialogs/findfiles/window.cpp 16
|
||||
|
||||
We set the context menu policy to of the table view to Qt::CustomContextMenu
|
||||
and connect a slot contextMenu() to its signal
|
||||
customContextMenuRequested(). We retrieve the absolute file name
|
||||
from the data of the QTableWidgetItem and populate the context menu
|
||||
with actions offering to copy the file name and to open the file.
|
||||
*/
|
||||
|
||||
|
@ -55,8 +55,8 @@
|
||||
|
||||
MainWindow::MainWindow()
|
||||
{
|
||||
textEdit = new QTextEdit;
|
||||
textEdit->setLineWrapMode(QTextEdit::NoWrap);
|
||||
textEdit = new QPlainTextEdit;
|
||||
textEdit->setLineWrapMode(QPlainTextEdit::NoWrap);
|
||||
setCentralWidget(textEdit);
|
||||
|
||||
findCodecs();
|
||||
@ -64,54 +64,57 @@ MainWindow::MainWindow()
|
||||
previewForm = new PreviewForm(this);
|
||||
previewForm->setCodecList(codecs);
|
||||
|
||||
createActions();
|
||||
createMenus();
|
||||
|
||||
setWindowTitle(tr("Codecs"));
|
||||
resize(500, 400);
|
||||
|
||||
const QRect screenGeometry = QApplication::desktop()->screenGeometry(this);
|
||||
resize(screenGeometry.width() / 2, screenGeometry.height() * 2 / 3);
|
||||
}
|
||||
|
||||
void MainWindow::open()
|
||||
{
|
||||
QString fileName = QFileDialog::getOpenFileName(this);
|
||||
if (!fileName.isEmpty()) {
|
||||
QFile file(fileName);
|
||||
if (!file.open(QFile::ReadOnly)) {
|
||||
QMessageBox::warning(this, tr("Codecs"),
|
||||
tr("Cannot read file %1:\n%2")
|
||||
.arg(fileName)
|
||||
.arg(file.errorString()));
|
||||
return;
|
||||
}
|
||||
|
||||
QByteArray data = file.readAll();
|
||||
|
||||
previewForm->setEncodedData(data);
|
||||
if (previewForm->exec())
|
||||
textEdit->setPlainText(previewForm->decodedString());
|
||||
const QString fileName = QFileDialog::getOpenFileName(this);
|
||||
if (fileName.isEmpty())
|
||||
return;
|
||||
QFile file(fileName);
|
||||
if (!file.open(QFile::ReadOnly)) {
|
||||
QMessageBox::warning(this, tr("Codecs"),
|
||||
tr("Cannot read file %1:\n%2")
|
||||
.arg(QDir::toNativeSeparators(fileName),
|
||||
file.errorString()));
|
||||
return;
|
||||
}
|
||||
|
||||
const QByteArray data = file.readAll();
|
||||
|
||||
previewForm->setWindowTitle(tr("Choose Encoding for %1").arg(QFileInfo(fileName).fileName()));
|
||||
previewForm->setEncodedData(data);
|
||||
if (previewForm->exec())
|
||||
textEdit->setPlainText(previewForm->decodedString());
|
||||
}
|
||||
|
||||
void MainWindow::save()
|
||||
{
|
||||
QString fileName = QFileDialog::getSaveFileName(this);
|
||||
if (!fileName.isEmpty()) {
|
||||
QFile file(fileName);
|
||||
if (!file.open(QFile::WriteOnly | QFile::Text)) {
|
||||
QMessageBox::warning(this, tr("Codecs"),
|
||||
tr("Cannot write file %1:\n%2")
|
||||
.arg(fileName)
|
||||
.arg(file.errorString()));
|
||||
return;
|
||||
}
|
||||
const QAction *action = qobject_cast<const QAction *>(sender());
|
||||
const QByteArray codecName = action->data().toByteArray();
|
||||
const QString title = tr("Save As (%1)").arg(QLatin1String(codecName));
|
||||
|
||||
QAction *action = qobject_cast<QAction *>(sender());
|
||||
QByteArray codecName = action->data().toByteArray();
|
||||
|
||||
QTextStream out(&file);
|
||||
out.setCodec(codecName.constData());
|
||||
out << textEdit->toPlainText();
|
||||
QString fileName = QFileDialog::getSaveFileName(this, title);
|
||||
if (fileName.isEmpty())
|
||||
return;
|
||||
QFile file(fileName);
|
||||
if (!file.open(QFile::WriteOnly | QFile::Text)) {
|
||||
QMessageBox::warning(this, tr("Codecs"),
|
||||
tr("Cannot write file %1:\n%2")
|
||||
.arg(QDir::toNativeSeparators(fileName),
|
||||
file.errorString()));
|
||||
return;
|
||||
}
|
||||
|
||||
QTextStream out(&file);
|
||||
out.setCodec(codecName.constData());
|
||||
out << textEdit->toPlainText();
|
||||
}
|
||||
|
||||
void MainWindow::about()
|
||||
@ -143,9 +146,9 @@ void MainWindow::findCodecs()
|
||||
QString sortKey = codec->name().toUpper();
|
||||
int rank;
|
||||
|
||||
if (sortKey.startsWith("UTF-8")) {
|
||||
if (sortKey.startsWith(QLatin1String("UTF-8"))) {
|
||||
rank = 1;
|
||||
} else if (sortKey.startsWith("UTF-16")) {
|
||||
} else if (sortKey.startsWith(QLatin1String("UTF-16"))) {
|
||||
rank = 2;
|
||||
} else if (iso8859RegExp.exactMatch(sortKey)) {
|
||||
if (iso8859RegExp.cap(1).size() == 1)
|
||||
@ -155,58 +158,38 @@ void MainWindow::findCodecs()
|
||||
} else {
|
||||
rank = 5;
|
||||
}
|
||||
sortKey.prepend(QChar('0' + rank));
|
||||
sortKey.prepend(QLatin1Char('0' + rank));
|
||||
|
||||
codecMap.insert(sortKey, codec);
|
||||
}
|
||||
codecs = codecMap.values();
|
||||
}
|
||||
|
||||
void MainWindow::createActions()
|
||||
void MainWindow::createMenus()
|
||||
{
|
||||
openAct = new QAction(tr("&Open..."), this);
|
||||
QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
|
||||
QAction *openAct =
|
||||
fileMenu->addAction(tr("&Open..."), this, &MainWindow::open);
|
||||
openAct->setShortcuts(QKeySequence::Open);
|
||||
connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
|
||||
|
||||
foreach (QTextCodec *codec, codecs) {
|
||||
QString text = tr("%1...").arg(QString(codec->name()));
|
||||
|
||||
QAction *action = new QAction(text, this);
|
||||
action->setData(codec->name());
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(save()));
|
||||
QMenu *saveAsMenu = fileMenu->addMenu(tr("&Save As"));
|
||||
connect(saveAsMenu, &QMenu::aboutToShow,
|
||||
this, &MainWindow::aboutToShowSaveAsMenu);
|
||||
foreach (const QTextCodec *codec, codecs) {
|
||||
const QByteArray name = codec->name();
|
||||
QAction *action = saveAsMenu->addAction(tr("%1...").arg(QLatin1String(name)));
|
||||
action->setData(QVariant(name));
|
||||
connect(action, &QAction::triggered, this, &MainWindow::save);
|
||||
saveAsActs.append(action);
|
||||
}
|
||||
|
||||
exitAct = new QAction(tr("E&xit"), this);
|
||||
exitAct->setShortcuts(QKeySequence::Quit);
|
||||
connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
|
||||
|
||||
aboutAct = new QAction(tr("&About"), this);
|
||||
connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
|
||||
|
||||
aboutQtAct = new QAction(tr("About &Qt"), this);
|
||||
connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
|
||||
}
|
||||
|
||||
void MainWindow::createMenus()
|
||||
{
|
||||
saveAsMenu = new QMenu(tr("&Save As"), this);
|
||||
foreach (QAction *action, saveAsActs)
|
||||
saveAsMenu->addAction(action);
|
||||
connect(saveAsMenu, SIGNAL(aboutToShow()),
|
||||
this, SLOT(aboutToShowSaveAsMenu()));
|
||||
|
||||
fileMenu = new QMenu(tr("&File"), this);
|
||||
fileMenu->addAction(openAct);
|
||||
fileMenu->addMenu(saveAsMenu);
|
||||
fileMenu->addSeparator();
|
||||
fileMenu->addAction(exitAct);
|
||||
QAction *exitAct = fileMenu->addAction(tr("E&xit"), this, &QWidget::close);
|
||||
exitAct->setShortcuts(QKeySequence::Quit);
|
||||
|
||||
helpMenu = new QMenu(tr("&Help"), this);
|
||||
helpMenu->addAction(aboutAct);
|
||||
helpMenu->addAction(aboutQtAct);
|
||||
|
||||
menuBar()->addMenu(fileMenu);
|
||||
menuBar()->addSeparator();
|
||||
menuBar()->addMenu(helpMenu);
|
||||
|
||||
QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));
|
||||
helpMenu->addAction(tr("&About"), this, &MainWindow::about);
|
||||
helpMenu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt);
|
||||
}
|
||||
|
@ -56,9 +56,8 @@
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QAction;
|
||||
class QMenu;
|
||||
class QTextCodec;
|
||||
class QTextEdit;
|
||||
class QPlainTextEdit;
|
||||
QT_END_NAMESPACE
|
||||
class PreviewForm;
|
||||
|
||||
@ -77,21 +76,12 @@ private slots:
|
||||
|
||||
private:
|
||||
void findCodecs();
|
||||
void createActions();
|
||||
void createMenus();
|
||||
|
||||
QTextEdit *textEdit;
|
||||
QList<QAction *> saveAsActs;
|
||||
QPlainTextEdit *textEdit;
|
||||
PreviewForm *previewForm;
|
||||
QList<QTextCodec *> codecs;
|
||||
|
||||
QMenu *fileMenu;
|
||||
QMenu *helpMenu;
|
||||
QMenu *saveAsMenu;
|
||||
QAction *openAct;
|
||||
QList<QAction *> saveAsActs;
|
||||
QAction *exitAct;
|
||||
QAction *aboutAct;
|
||||
QAction *aboutQtAct;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -52,47 +52,159 @@
|
||||
|
||||
#include "previewform.h"
|
||||
|
||||
// Helpers for creating hex dumps
|
||||
static void indent(QTextStream &str, int indent)
|
||||
{
|
||||
for (int i = 0; i < indent; ++i)
|
||||
str << ' ';
|
||||
}
|
||||
|
||||
static void formatHex(QTextStream &str, const QByteArray &data)
|
||||
{
|
||||
const int fieldWidth = str.fieldWidth();
|
||||
const QTextStream::FieldAlignment alignment = str.fieldAlignment();
|
||||
const int base = str.integerBase();
|
||||
const QChar padChar = str.padChar();
|
||||
str.setIntegerBase(16);
|
||||
str.setPadChar(QLatin1Char('0'));
|
||||
str.setFieldAlignment(QTextStream::AlignRight);
|
||||
|
||||
const unsigned char *p = reinterpret_cast<const unsigned char *>(data.constBegin());
|
||||
for (const unsigned char *end = p + data.size(); p < end; ++p) {
|
||||
str << ' ';
|
||||
str.setFieldWidth(2);
|
||||
str << unsigned(*p);
|
||||
str.setFieldWidth(fieldWidth);
|
||||
}
|
||||
str.setFieldAlignment(alignment);
|
||||
str.setPadChar(padChar);
|
||||
str.setIntegerBase(base);
|
||||
}
|
||||
|
||||
static void formatPrintableCharacters(QTextStream &str, const QByteArray &data)
|
||||
{
|
||||
for (int i = 0, size = data.size(); i < size; ++i) {
|
||||
const char c = data.at(i);
|
||||
switch (c) {
|
||||
case '\0':
|
||||
str << "\\0";
|
||||
break;
|
||||
case '\t':
|
||||
str << "\\t";
|
||||
break;
|
||||
case '\r':
|
||||
str << "\\r";
|
||||
break;
|
||||
case '\n':
|
||||
str << "\\n";
|
||||
break;
|
||||
default:
|
||||
if (c >= 32 && uchar(c) < 127)
|
||||
str << ' ' << c;
|
||||
else
|
||||
str << "..";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static QString formatHexDump(const QByteArray &data)
|
||||
{
|
||||
enum { lineWidth = 16 };
|
||||
QString result;
|
||||
QTextStream str(&result);
|
||||
str.setIntegerBase(16);
|
||||
str.setPadChar(QLatin1Char('0'));
|
||||
const int fieldWidth = str.fieldWidth();
|
||||
const QTextStream::FieldAlignment alignment = str.fieldAlignment();
|
||||
for (int a = 0, size = data.size(); a < size; a += lineWidth) {
|
||||
str.setFieldAlignment(QTextStream::AlignRight);
|
||||
str.setFieldWidth(8);
|
||||
str << a;
|
||||
str.setFieldWidth(fieldWidth);
|
||||
str.setFieldAlignment(alignment);
|
||||
|
||||
const int end = qMin(a + lineWidth, size);
|
||||
const QByteArray line = data.mid(a, end - a);
|
||||
|
||||
formatHex(str, line);
|
||||
indent(str, 3 * (lineWidth - line.size()));
|
||||
|
||||
str << ' ';
|
||||
formatPrintableCharacters(str, line);
|
||||
indent(str, 2 * (lineWidth - line.size()));
|
||||
str << '\n';
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
PreviewForm::PreviewForm(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
{
|
||||
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||
encodingComboBox = new QComboBox;
|
||||
|
||||
encodingLabel = new QLabel(tr("&Encoding:"));
|
||||
QLabel *encodingLabel = new QLabel(tr("&Encoding:"));
|
||||
encodingLabel->setBuddy(encodingComboBox);
|
||||
|
||||
textEdit = new QTextEdit;
|
||||
textEdit->setLineWrapMode(QTextEdit::NoWrap);
|
||||
textEdit = new QPlainTextEdit;
|
||||
textEdit->setLineWrapMode(QPlainTextEdit::NoWrap);
|
||||
textEdit->setReadOnly(true);
|
||||
hexDumpEdit = new QPlainTextEdit;
|
||||
hexDumpEdit->setLineWrapMode(QPlainTextEdit::NoWrap);
|
||||
hexDumpEdit->setReadOnly(true);
|
||||
hexDumpEdit->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
|
||||
|
||||
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok
|
||||
| QDialogButtonBox::Cancel);
|
||||
QDialogButtonBox *buttonBox =
|
||||
new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||
okButton = buttonBox->button(QDialogButtonBox::Ok);
|
||||
|
||||
connect(encodingComboBox, SIGNAL(activated(int)),
|
||||
this, SLOT(updateTextEdit()));
|
||||
connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
|
||||
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
|
||||
typedef void(QComboBox::*ComboBoxIntSignal)(int);
|
||||
connect(encodingComboBox, static_cast<ComboBoxIntSignal>(&QComboBox::activated),
|
||||
this, &PreviewForm::updateTextEdit);
|
||||
connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||||
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
|
||||
QGridLayout *mainLayout = new QGridLayout;
|
||||
QGridLayout *mainLayout = new QGridLayout(this);
|
||||
mainLayout->addWidget(encodingLabel, 0, 0);
|
||||
mainLayout->addWidget(encodingComboBox, 0, 1);
|
||||
mainLayout->addWidget(textEdit, 1, 0, 1, 2);
|
||||
mainLayout->addWidget(buttonBox, 2, 0, 1, 2);
|
||||
setLayout(mainLayout);
|
||||
tabWidget = new QTabWidget;
|
||||
tabWidget->addTab(textEdit, tr("Preview"));
|
||||
tabWidget->addTab(hexDumpEdit, tr("Hex Dump"));
|
||||
mainLayout->addWidget(tabWidget, 1, 0, 1, 2);
|
||||
statusLabel = new QLabel;
|
||||
mainLayout->addWidget(statusLabel, 2, 0, 1, 2);
|
||||
mainLayout->addWidget(buttonBox, 3, 0, 1, 2);
|
||||
|
||||
setWindowTitle(tr("Choose Encoding"));
|
||||
resize(400, 300);
|
||||
const QRect screenGeometry = QApplication::desktop()->screenGeometry(this);
|
||||
resize(screenGeometry.width() * 2 / 5, screenGeometry.height() / 2);
|
||||
}
|
||||
|
||||
void PreviewForm::setCodecList(const QList<QTextCodec *> &list)
|
||||
{
|
||||
encodingComboBox->clear();
|
||||
foreach (QTextCodec *codec, list)
|
||||
encodingComboBox->addItem(codec->name(), codec->mibEnum());
|
||||
foreach (const QTextCodec *codec, list) {
|
||||
encodingComboBox->addItem(QLatin1String(codec->name()),
|
||||
QVariant(codec->mibEnum()));
|
||||
}
|
||||
}
|
||||
|
||||
void PreviewForm::reset()
|
||||
{
|
||||
decodedStr.clear();
|
||||
textEdit->clear();
|
||||
hexDumpEdit->clear();
|
||||
statusLabel->clear();
|
||||
statusLabel->setStyleSheet(QString());
|
||||
okButton->setEnabled(false);
|
||||
tabWidget->setCurrentIndex(0);
|
||||
}
|
||||
|
||||
void PreviewForm::setEncodedData(const QByteArray &data)
|
||||
{
|
||||
reset();
|
||||
encodedData = data;
|
||||
hexDumpEdit->setPlainText(formatHexDump(data));
|
||||
updateTextEdit();
|
||||
}
|
||||
|
||||
@ -100,12 +212,30 @@ void PreviewForm::updateTextEdit()
|
||||
{
|
||||
int mib = encodingComboBox->itemData(
|
||||
encodingComboBox->currentIndex()).toInt();
|
||||
QTextCodec *codec = QTextCodec::codecForMib(mib);
|
||||
const QTextCodec *codec = QTextCodec::codecForMib(mib);
|
||||
const QString name = QLatin1String(codec->name());
|
||||
|
||||
QTextStream in(&encodedData);
|
||||
in.setAutoDetectUnicode(false);
|
||||
in.setCodec(codec);
|
||||
decodedStr = in.readAll();
|
||||
QTextCodec::ConverterState state;
|
||||
decodedStr = codec->toUnicode(encodedData.constData(), encodedData.size(), &state);
|
||||
|
||||
textEdit->setPlainText(decodedStr);
|
||||
bool success = true;
|
||||
if (state.remainingChars) {
|
||||
success = false;
|
||||
const QString message =
|
||||
tr("%1: conversion error at character %2")
|
||||
.arg(name).arg(encodedData.size() - state.remainingChars + 1);
|
||||
statusLabel->setText(message);
|
||||
statusLabel->setStyleSheet(QStringLiteral("background-color: \"red\";"));
|
||||
} else if (state.invalidChars) {
|
||||
statusLabel->setText(tr("%1: %n invalid characters", 0, state.invalidChars).arg(name));
|
||||
statusLabel->setStyleSheet(QStringLiteral("background-color: \"yellow\";"));
|
||||
} else {
|
||||
statusLabel->setText(tr("%1: %n bytes converted", 0, encodedData.size()).arg(name));
|
||||
statusLabel->setStyleSheet(QString());
|
||||
}
|
||||
if (success)
|
||||
textEdit->setPlainText(decodedStr);
|
||||
else
|
||||
textEdit->clear();
|
||||
okButton->setEnabled(success);
|
||||
}
|
||||
|
@ -58,8 +58,10 @@ QT_BEGIN_NAMESPACE
|
||||
class QComboBox;
|
||||
class QDialogButtonBox;
|
||||
class QLabel;
|
||||
class QPlainTextEdit;
|
||||
class QPushButton;
|
||||
class QTabWidget;
|
||||
class QTextCodec;
|
||||
class QTextEdit;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class PreviewForm : public QDialog
|
||||
@ -67,7 +69,7 @@ class PreviewForm : public QDialog
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PreviewForm(QWidget *parent = 0);
|
||||
explicit PreviewForm(QWidget *parent = Q_NULLPTR);
|
||||
|
||||
void setCodecList(const QList<QTextCodec *> &list);
|
||||
void setEncodedData(const QByteArray &data);
|
||||
@ -77,13 +79,17 @@ private slots:
|
||||
void updateTextEdit();
|
||||
|
||||
private:
|
||||
void reset();
|
||||
|
||||
QByteArray encodedData;
|
||||
QString decodedStr;
|
||||
|
||||
QPushButton *okButton;
|
||||
QTabWidget *tabWidget;
|
||||
QComboBox *encodingComboBox;
|
||||
QLabel *encodingLabel;
|
||||
QTextEdit *textEdit;
|
||||
QDialogButtonBox *buttonBox;
|
||||
QPlainTextEdit *textEdit;
|
||||
QPlainTextEdit *hexDumpEdit;
|
||||
QLabel *statusLabel;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -54,11 +54,9 @@
|
||||
|
||||
//! [0]
|
||||
CharacterWidget::CharacterWidget(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
: QWidget(parent), columns(16), lastKey(-1)
|
||||
{
|
||||
squareSize = 24;
|
||||
columns = 16;
|
||||
lastKey = -1;
|
||||
calculateSquareSize();
|
||||
setMouseTracking(true);
|
||||
}
|
||||
//! [0]
|
||||
@ -67,7 +65,7 @@ CharacterWidget::CharacterWidget(QWidget *parent)
|
||||
void CharacterWidget::updateFont(const QFont &font)
|
||||
{
|
||||
displayFont.setFamily(font.family());
|
||||
squareSize = qMax(24, QFontMetrics(displayFont).xHeight() * 3);
|
||||
calculateSquareSize();
|
||||
adjustSize();
|
||||
update();
|
||||
}
|
||||
@ -77,7 +75,7 @@ void CharacterWidget::updateFont(const QFont &font)
|
||||
void CharacterWidget::updateSize(const QString &fontSize)
|
||||
{
|
||||
displayFont.setPointSize(fontSize.toInt());
|
||||
squareSize = qMax(24, QFontMetrics(displayFont).xHeight() * 3);
|
||||
calculateSquareSize();
|
||||
adjustSize();
|
||||
update();
|
||||
}
|
||||
@ -89,7 +87,7 @@ void CharacterWidget::updateStyle(const QString &fontStyle)
|
||||
const QFont::StyleStrategy oldStrategy = displayFont.styleStrategy();
|
||||
displayFont = fontDatabase.font(displayFont.family(), fontStyle, displayFont.pointSize());
|
||||
displayFont.setStyleStrategy(oldStrategy);
|
||||
squareSize = qMax(24, QFontMetrics(displayFont).xHeight() * 3);
|
||||
calculateSquareSize();
|
||||
adjustSize();
|
||||
update();
|
||||
}
|
||||
@ -104,6 +102,11 @@ void CharacterWidget::updateFontMerging(bool enable)
|
||||
update();
|
||||
}
|
||||
|
||||
void CharacterWidget::calculateSquareSize()
|
||||
{
|
||||
squareSize = qMax(16, 4 + QFontMetrics(displayFont, this).height());
|
||||
}
|
||||
|
||||
//! [3]
|
||||
QSize CharacterWidget::sizeHint() const
|
||||
{
|
||||
|
@ -86,6 +86,8 @@ protected:
|
||||
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
|
||||
|
||||
private:
|
||||
void calculateSquareSize();
|
||||
|
||||
QFont displayFont;
|
||||
int columns;
|
||||
int lastKey;
|
||||
|
@ -54,10 +54,30 @@
|
||||
#include "mainwindow.h"
|
||||
|
||||
//! [0]
|
||||
|
||||
Q_DECLARE_METATYPE(QFontComboBox::FontFilter)
|
||||
|
||||
MainWindow::MainWindow()
|
||||
{
|
||||
QMenu *fileMenu = menuBar()->addMenu(tr("File"));
|
||||
fileMenu->addAction(tr("Quit"), this, &QWidget::close);
|
||||
QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));
|
||||
helpMenu->addAction(tr("Show Font Info"), this, &MainWindow::showInfo);
|
||||
helpMenu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt);
|
||||
|
||||
QWidget *centralWidget = new QWidget;
|
||||
|
||||
QLabel *filterLabel = new QLabel(tr("Filter:"));
|
||||
filterCombo = new QComboBox;
|
||||
filterCombo->addItem(tr("All"), QVariant::fromValue(QFontComboBox::AllFonts));
|
||||
filterCombo->addItem(tr("Scalable"), QVariant::fromValue(QFontComboBox::ScalableFonts));
|
||||
filterCombo->addItem(tr("Monospaced"), QVariant::fromValue(QFontComboBox::MonospacedFonts));
|
||||
filterCombo->addItem(tr("Proportional"), QVariant::fromValue(QFontComboBox::ProportionalFonts));
|
||||
filterCombo->setCurrentIndex(0);
|
||||
typedef void (QComboBox::*QComboBoxIntSignal)(int);
|
||||
connect(filterCombo, static_cast<QComboBoxIntSignal>(&QComboBox::currentIndexChanged),
|
||||
this, &MainWindow::filterChanged);
|
||||
|
||||
QLabel *fontLabel = new QLabel(tr("Font:"));
|
||||
fontCombo = new QFontComboBox;
|
||||
QLabel *sizeLabel = new QLabel(tr("Size:"));
|
||||
@ -80,38 +100,39 @@ MainWindow::MainWindow()
|
||||
|
||||
//! [2]
|
||||
lineEdit = new QLineEdit;
|
||||
lineEdit->setClearButtonEnabled(true);
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
QPushButton *clipboardButton = new QPushButton(tr("&To clipboard"));
|
||||
//! [2]
|
||||
|
||||
//! [3]
|
||||
clipboard = QApplication::clipboard();
|
||||
//! [3]
|
||||
#endif
|
||||
|
||||
//! [4]
|
||||
connect(fontCombo, SIGNAL(currentFontChanged(QFont)),
|
||||
this, SLOT(findStyles(QFont)));
|
||||
connect(fontCombo, SIGNAL(currentFontChanged(QFont)),
|
||||
this, SLOT(findSizes(QFont)));
|
||||
connect(fontCombo, SIGNAL(currentFontChanged(QFont)),
|
||||
characterWidget, SLOT(updateFont(QFont)));
|
||||
connect(sizeCombo, SIGNAL(currentIndexChanged(QString)),
|
||||
characterWidget, SLOT(updateSize(QString)));
|
||||
connect(styleCombo, SIGNAL(currentIndexChanged(QString)),
|
||||
characterWidget, SLOT(updateStyle(QString)));
|
||||
connect(fontCombo, &QFontComboBox::currentFontChanged,
|
||||
this, &MainWindow::findStyles);
|
||||
connect(fontCombo, &QFontComboBox::currentFontChanged,
|
||||
this, &MainWindow::findSizes);
|
||||
connect(fontCombo, &QFontComboBox::currentFontChanged,
|
||||
characterWidget, &CharacterWidget::updateFont);
|
||||
typedef void (QComboBox::*QComboBoxStringSignal)(const QString &);
|
||||
connect(sizeCombo, static_cast<QComboBoxStringSignal>(&QComboBox::currentIndexChanged),
|
||||
characterWidget, &CharacterWidget::updateSize);
|
||||
connect(styleCombo, static_cast<QComboBoxStringSignal>(&QComboBox::currentIndexChanged),
|
||||
characterWidget, &CharacterWidget::updateStyle);
|
||||
//! [4] //! [5]
|
||||
connect(characterWidget, SIGNAL(characterSelected(QString)),
|
||||
this, SLOT(insertCharacter(QString)));
|
||||
connect(characterWidget, &CharacterWidget::characterSelected,
|
||||
this, &MainWindow::insertCharacter);
|
||||
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
connect(clipboardButton, SIGNAL(clicked()), this, SLOT(updateClipboard()));
|
||||
connect(clipboardButton, &QAbstractButton::clicked, this, &MainWindow::updateClipboard);
|
||||
#endif
|
||||
//! [5]
|
||||
connect(fontMerging, SIGNAL(toggled(bool)), characterWidget, SLOT(updateFontMerging(bool)));
|
||||
connect(fontMerging, &QAbstractButton::toggled, characterWidget, &CharacterWidget::updateFontMerging);
|
||||
|
||||
//! [6]
|
||||
QHBoxLayout *controlsLayout = new QHBoxLayout;
|
||||
controlsLayout->addWidget(filterLabel);
|
||||
controlsLayout->addWidget(filterCombo, 1);
|
||||
controlsLayout->addWidget(fontLabel);
|
||||
controlsLayout->addWidget(fontCombo, 1);
|
||||
controlsLayout->addWidget(sizeLabel);
|
||||
@ -163,6 +184,14 @@ void MainWindow::findStyles(const QFont &font)
|
||||
}
|
||||
//! [8]
|
||||
|
||||
void MainWindow::filterChanged(int f)
|
||||
{
|
||||
const QFontComboBox::FontFilter filter =
|
||||
filterCombo->itemData(f).value<QFontComboBox::FontFilter>();
|
||||
fontCombo->setFontFilters(filter);
|
||||
statusBar()->showMessage(tr("%n font(s) found", 0, fontCombo->count()));
|
||||
}
|
||||
|
||||
void MainWindow::findSizes(const QFont &font)
|
||||
{
|
||||
QFontDatabase fontDatabase;
|
||||
@ -208,9 +237,63 @@ void MainWindow::insertCharacter(const QString &character)
|
||||
void MainWindow::updateClipboard()
|
||||
{
|
||||
//! [11]
|
||||
clipboard->setText(lineEdit->text(), QClipboard::Clipboard);
|
||||
QGuiApplication::clipboard()->setText(lineEdit->text(), QClipboard::Clipboard);
|
||||
//! [11]
|
||||
clipboard->setText(lineEdit->text(), QClipboard::Selection);
|
||||
QGuiApplication::clipboard()->setText(lineEdit->text(), QClipboard::Selection);
|
||||
}
|
||||
#endif
|
||||
|
||||
class FontInfoDialog : public QDialog
|
||||
{
|
||||
public:
|
||||
explicit FontInfoDialog(QWidget *parent = Q_NULLPTR);
|
||||
|
||||
private:
|
||||
QString text() const;
|
||||
};
|
||||
|
||||
FontInfoDialog::FontInfoDialog(QWidget *parent) : QDialog(parent)
|
||||
{
|
||||
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||
QVBoxLayout *mainLayout = new QVBoxLayout(this);
|
||||
QPlainTextEdit *textEdit = new QPlainTextEdit(text(), this);
|
||||
textEdit->setReadOnly(true);
|
||||
textEdit->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
|
||||
mainLayout->addWidget(textEdit);
|
||||
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, this);
|
||||
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
mainLayout->addWidget(buttonBox);
|
||||
}
|
||||
|
||||
QString FontInfoDialog::text() const
|
||||
{
|
||||
QString text;
|
||||
QTextStream str(&text);
|
||||
const QFont defaultFont = QFontDatabase::systemFont(QFontDatabase::GeneralFont);
|
||||
const QFont fixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);
|
||||
const QFont titleFont = QFontDatabase::systemFont(QFontDatabase::TitleFont);
|
||||
const QFont smallestReadableFont = QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont);
|
||||
|
||||
str << "Qt " << QT_VERSION_STR << " on " << QGuiApplication::platformName()
|
||||
<< ", " << logicalDpiX() << "DPI";
|
||||
if (!qFuzzyCompare(devicePixelRatioF(), qreal(1)))
|
||||
str << ", device pixel ratio: " << devicePixelRatioF();
|
||||
str << "\n\nDefault font : " << defaultFont.family() << ", " << defaultFont.pointSizeF() << "pt\n"
|
||||
<< "Fixed font : " << fixedFont.family() << ", " << fixedFont.pointSizeF() << "pt\n"
|
||||
<< "Title font : " << titleFont.family() << ", " << titleFont.pointSizeF() << "pt\n"
|
||||
<< "Smallest font: " << smallestReadableFont.family() << ", " << smallestReadableFont.pointSizeF() << "pt\n";
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
void MainWindow::showInfo()
|
||||
{
|
||||
const QRect screenGeometry = QApplication::desktop()->screenGeometry(this);
|
||||
FontInfoDialog *dialog = new FontInfoDialog(this);
|
||||
dialog->setWindowTitle(tr("Fonts"));
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
dialog->resize(screenGeometry.width() / 4, screenGeometry.height() / 4);
|
||||
dialog->show();
|
||||
}
|
||||
|
||||
//! [10]
|
||||
|
@ -73,18 +73,18 @@ public:
|
||||
MainWindow();
|
||||
|
||||
public slots:
|
||||
void filterChanged(int);
|
||||
void findStyles(const QFont &font);
|
||||
void findSizes(const QFont &font);
|
||||
void insertCharacter(const QString &character);
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
void updateClipboard();
|
||||
#endif
|
||||
void showInfo();
|
||||
|
||||
private:
|
||||
CharacterWidget *characterWidget;
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
QClipboard *clipboard;
|
||||
#endif
|
||||
QComboBox *filterCombo;
|
||||
QComboBox *styleCombo;
|
||||
QComboBox *sizeCombo;
|
||||
QFontComboBox *fontCombo;
|
||||
|
@ -3172,8 +3172,8 @@ QUrl QUrl::resolved(const QUrl &relative) const
|
||||
if (!relative.d) return *this;
|
||||
|
||||
QUrl t;
|
||||
// be non strict and allow scheme in relative url
|
||||
if (!relative.d->scheme.isEmpty() && relative.d->scheme != d->scheme) {
|
||||
// Compatibility hack (mostly for qtdeclarative) : treat "file:relative.txt" as relative even though QUrl::isRelative() says false
|
||||
if (!relative.d->scheme.isEmpty() && (!relative.isLocalFile() || QDir::isAbsolutePath(relative.d->path))) {
|
||||
t = relative;
|
||||
t.detach();
|
||||
} else {
|
||||
|
@ -1328,6 +1328,7 @@ void QSortFilterProxyModelPrivate::_q_sourceReset()
|
||||
void QSortFilterProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
|
||||
{
|
||||
Q_Q(QSortFilterProxyModel);
|
||||
Q_UNUSED(hint); // We can't forward Hint because we might filter additional rows or columns
|
||||
saved_persistent_indexes.clear();
|
||||
|
||||
QList<QPersistentModelIndex> parents;
|
||||
@ -1346,7 +1347,7 @@ void QSortFilterProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<Q
|
||||
if (!sourceParents.isEmpty() && parents.isEmpty())
|
||||
return;
|
||||
|
||||
emit q->layoutAboutToBeChanged(parents, hint);
|
||||
emit q->layoutAboutToBeChanged(parents);
|
||||
if (persistent.indexes.isEmpty())
|
||||
return;
|
||||
|
||||
@ -1356,6 +1357,7 @@ void QSortFilterProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<Q
|
||||
void QSortFilterProxyModelPrivate::_q_sourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
|
||||
{
|
||||
Q_Q(QSortFilterProxyModel);
|
||||
Q_UNUSED(hint); // We can't forward Hint because we might filter additional rows or columns
|
||||
|
||||
// Optimize: We only actually have to clear the mapping related to the contents of
|
||||
// sourceParents, not everything.
|
||||
@ -1385,7 +1387,7 @@ void QSortFilterProxyModelPrivate::_q_sourceLayoutChanged(const QList<QPersisten
|
||||
if (!sourceParents.isEmpty() && parents.isEmpty())
|
||||
return;
|
||||
|
||||
emit q->layoutChanged(parents, hint);
|
||||
emit q->layoutChanged(parents);
|
||||
}
|
||||
|
||||
void QSortFilterProxyModelPrivate::_q_sourceRowsAboutToBeInserted(
|
||||
|
@ -307,9 +307,9 @@ QStringList QStringListModel::stringList() const
|
||||
*/
|
||||
void QStringListModel::setStringList(const QStringList &strings)
|
||||
{
|
||||
emit beginResetModel();
|
||||
beginResetModel();
|
||||
lst = strings;
|
||||
emit endResetModel();
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -3560,6 +3560,8 @@ int QVariant::compare(const QVariant &v) const
|
||||
return v1.toTime() < v2.toTime() ? -1 : 1;
|
||||
case QVariant::DateTime:
|
||||
return v1.toDateTime() < v2.toDateTime() ? -1 : 1;
|
||||
case QVariant::StringList:
|
||||
return v1.toStringList() < v2.toStringList() ? -1 : 1;
|
||||
}
|
||||
int r = v1.toString().compare(v2.toString(), Qt::CaseInsensitive);
|
||||
if (r == 0) {
|
||||
|
@ -150,7 +150,7 @@ QCommandLineOption::QCommandLineOption(const QStringList &names)
|
||||
The description is set to \a description. It is customary to add a "."
|
||||
at the end of the description.
|
||||
|
||||
In addition, the \a valueName can be set if the option expects a value.
|
||||
In addition, the \a valueName needs to be set if the option expects a value.
|
||||
The default value for the option is set to \a defaultValue.
|
||||
|
||||
In Qt versions before 5.4, this constructor was \c explicit. In Qt 5.4
|
||||
@ -186,7 +186,7 @@ QCommandLineOption::QCommandLineOption(const QString &name, const QString &descr
|
||||
The description is set to \a description. It is customary to add a "."
|
||||
at the end of the description.
|
||||
|
||||
In addition, the \a valueName can be set if the option expects a value.
|
||||
In addition, the \a valueName needs to be set if the option expects a value.
|
||||
The default value for the option is set to \a defaultValue.
|
||||
|
||||
In Qt versions before 5.4, this constructor was \c explicit. In Qt 5.4
|
||||
|
@ -9468,7 +9468,7 @@ QString &QString::append(const QStringRef &str)
|
||||
{
|
||||
if (str.string() == this) {
|
||||
str.appendTo(this);
|
||||
} else if (str.string()) {
|
||||
} else if (!str.isNull()) {
|
||||
int oldSize = size();
|
||||
resize(oldSize + str.size());
|
||||
memcpy(data() + oldSize, str.unicode(), str.size() * sizeof(QChar));
|
||||
|
@ -909,13 +909,12 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
|
||||
if (m_tranTimes.size() > 0 && m_tranTimes.last().atMSecsSinceEpoch < forMSecsSinceEpoch
|
||||
&& !m_posixRule.isEmpty() && forMSecsSinceEpoch >= 0) {
|
||||
const int year = QDateTime::fromMSecsSinceEpoch(forMSecsSinceEpoch, Qt::UTC).date().year();
|
||||
const int lastMSecs = (m_tranTimes.size() > 0) ? m_tranTimes.last().atMSecsSinceEpoch : 0;
|
||||
QVector<QTimeZonePrivate::Data> posixTrans = calculatePosixTransitions(m_posixRule, year - 1,
|
||||
year + 1, lastMSecs);
|
||||
QVector<QTimeZonePrivate::Data> posixTrans =
|
||||
calculatePosixTransitions(m_posixRule, year - 1, year + 1,
|
||||
m_tranTimes.last().atMSecsSinceEpoch);
|
||||
for (int i = posixTrans.size() - 1; i >= 0; --i) {
|
||||
if (posixTrans.at(i).atMSecsSinceEpoch <= forMSecsSinceEpoch) {
|
||||
QTimeZonePrivate::Data data;
|
||||
data = posixTrans.at(i);
|
||||
QTimeZonePrivate::Data data = posixTrans.at(i);
|
||||
data.atMSecsSinceEpoch = forMSecsSinceEpoch;
|
||||
return data;
|
||||
}
|
||||
@ -953,9 +952,9 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::nextTransition(qint64 afterMSecsSince
|
||||
if (m_tranTimes.size() > 0 && m_tranTimes.last().atMSecsSinceEpoch < afterMSecsSinceEpoch
|
||||
&& !m_posixRule.isEmpty() && afterMSecsSinceEpoch >= 0) {
|
||||
const int year = QDateTime::fromMSecsSinceEpoch(afterMSecsSinceEpoch, Qt::UTC).date().year();
|
||||
const int lastMSecs = (m_tranTimes.size() > 0) ? m_tranTimes.last().atMSecsSinceEpoch : 0;
|
||||
QVector<QTimeZonePrivate::Data> posixTrans = calculatePosixTransitions(m_posixRule, year - 1,
|
||||
year + 1, lastMSecs);
|
||||
QVector<QTimeZonePrivate::Data> posixTrans =
|
||||
calculatePosixTransitions(m_posixRule, year - 1, year + 1,
|
||||
m_tranTimes.last().atMSecsSinceEpoch);
|
||||
for (int i = 0; i < posixTrans.size(); ++i) {
|
||||
if (posixTrans.at(i).atMSecsSinceEpoch > afterMSecsSinceEpoch)
|
||||
return posixTrans.at(i);
|
||||
@ -979,9 +978,9 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::previousTransition(qint64 beforeMSecs
|
||||
if (m_tranTimes.size() > 0 && m_tranTimes.last().atMSecsSinceEpoch < beforeMSecsSinceEpoch
|
||||
&& !m_posixRule.isEmpty() && beforeMSecsSinceEpoch > 0) {
|
||||
const int year = QDateTime::fromMSecsSinceEpoch(beforeMSecsSinceEpoch, Qt::UTC).date().year();
|
||||
const int lastMSecs = (m_tranTimes.size() > 0) ? m_tranTimes.last().atMSecsSinceEpoch : 0;
|
||||
QVector<QTimeZonePrivate::Data> posixTrans = calculatePosixTransitions(m_posixRule, year - 1,
|
||||
year + 1, lastMSecs);
|
||||
QVector<QTimeZonePrivate::Data> posixTrans =
|
||||
calculatePosixTransitions(m_posixRule, year - 1, year + 1,
|
||||
m_tranTimes.last().atMSecsSinceEpoch);
|
||||
for (int i = posixTrans.size() - 1; i >= 0; --i) {
|
||||
if (posixTrans.at(i).atMSecsSinceEpoch < beforeMSecsSinceEpoch)
|
||||
return posixTrans.at(i);
|
||||
|
@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE
|
||||
|
||||
class Q_GUI_EXPORT QBlittablePlatformPixmap : public QPlatformPixmap
|
||||
{
|
||||
// Q_DECLARE_PRIVATE(QBlittablePlatformPixmap);
|
||||
// Q_DECLARE_PRIVATE(QBlittablePlatformPixmap)
|
||||
public:
|
||||
QBlittablePlatformPixmap();
|
||||
~QBlittablePlatformPixmap();
|
||||
|
@ -225,9 +225,9 @@ void Q_GUI_EXPORT qt_set_sequence_auto_mnemonic(bool b) { qt_sequence_no_mnemoni
|
||||
code point of the character; for example, 'A' gives the same key sequence
|
||||
as Qt::Key_A.
|
||||
|
||||
\b{Note:} On OS X, references to "Ctrl", Qt::CTRL, Qt::Control
|
||||
\note On OS X, references to "Ctrl", Qt::CTRL, Qt::Key_Control
|
||||
and Qt::ControlModifier correspond to the \uicontrol Command keys on the
|
||||
Macintosh keyboard, and references to "Meta", Qt::META, Qt::Meta and
|
||||
Macintosh keyboard, and references to "Meta", Qt::META, Qt::Key_Meta and
|
||||
Qt::MetaModifier correspond to the \uicontrol Control keys. Developers on
|
||||
OS X can use the same shortcut descriptions across all platforms,
|
||||
and their applications will automatically work as expected on OS X.
|
||||
|
@ -89,8 +89,8 @@ public:
|
||||
static QMatrix3x3 sourceTransform(const QRectF &subTexture, const QSize &textureSize, Origin origin);
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(QOpenGLTextureBlitter);
|
||||
Q_DECLARE_PRIVATE(QOpenGLTextureBlitter);
|
||||
Q_DISABLE_COPY(QOpenGLTextureBlitter)
|
||||
Q_DECLARE_PRIVATE(QOpenGLTextureBlitter)
|
||||
QScopedPointer<QOpenGLTextureBlitterPrivate> d_ptr;
|
||||
};
|
||||
|
||||
|
@ -63,7 +63,7 @@ class QBlittablePrivate;
|
||||
|
||||
class Q_GUI_EXPORT QBlittable
|
||||
{
|
||||
Q_DECLARE_PRIVATE(QBlittable);
|
||||
Q_DECLARE_PRIVATE(QBlittable)
|
||||
public:
|
||||
enum Capability {
|
||||
|
||||
|
@ -40,31 +40,37 @@
|
||||
#include "qglobal.h"
|
||||
#include "qrgb.h"
|
||||
#include "qstringlist.h"
|
||||
#include "private/qtools_p.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
static inline int h2i(char hex)
|
||||
{
|
||||
if (hex >= '0' && hex <= '9')
|
||||
return hex - '0';
|
||||
if (hex >= 'a' && hex <= 'f')
|
||||
return hex - 'a' + 10;
|
||||
if (hex >= 'A' && hex <= 'F')
|
||||
return hex - 'A' + 10;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
If s[0..1] is a valid hex number, returns its integer value,
|
||||
otherwise returns -1.
|
||||
*/
|
||||
static inline int hex2int(const char *s)
|
||||
{
|
||||
return (h2i(s[0]) << 4) | h2i(s[1]);
|
||||
const int hi = QtMiscUtils::fromHex(s[0]);
|
||||
if (hi < 0)
|
||||
return -1;
|
||||
const int lo = QtMiscUtils::fromHex(s[1]);
|
||||
if (lo < 0)
|
||||
return -1;
|
||||
return (hi << 4) | lo;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
If s is a valid hex digit, returns its integer value,
|
||||
multiplied by 0x11, otherwise returns -1.
|
||||
*/
|
||||
static inline int hex2int(char s)
|
||||
{
|
||||
int h = h2i(s);
|
||||
return (h << 4) | h;
|
||||
const int h = QtMiscUtils::fromHex(s);
|
||||
return h < 0 ? h : (h << 4) | h;
|
||||
}
|
||||
|
||||
bool qt_get_hex_rgb(const char *name, QRgb *rgb)
|
||||
@ -130,7 +136,7 @@ bool qt_get_hex_rgb(const QChar *str, int len, QRgb *rgb)
|
||||
#define rgb(r,g,b) (0xff000000 | (r << 16) | (g << 8) | b)
|
||||
|
||||
static const struct RGBData {
|
||||
const char *name;
|
||||
const char name[21];
|
||||
uint value;
|
||||
} rgbTbl[] = {
|
||||
{ "aliceblue", rgb(240, 248, 255) },
|
||||
|
@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE
|
||||
|
||||
template <typename Type> class QDataBuffer
|
||||
{
|
||||
Q_DISABLE_COPY(QDataBuffer);
|
||||
Q_DISABLE_COPY(QDataBuffer)
|
||||
public:
|
||||
QDataBuffer(int res)
|
||||
{
|
||||
|
@ -2814,10 +2814,16 @@ static const QRgba64 *QT_FASTCALL fetchTransformedBilinear64(QRgba64 *buffer, co
|
||||
sbuf2[i * 2 + 1] = ((const uint*)s2)[x2];
|
||||
fx += fdx;
|
||||
}
|
||||
int fastLen;
|
||||
if (fdx > 0)
|
||||
fastLen = qMin(len, int((image_x2 - (fx >> 16)) / data->m11));
|
||||
else
|
||||
fastLen = qMin(len, int((image_x1 - (fx >> 16)) / data->m11));
|
||||
fastLen -= 3;
|
||||
|
||||
const __m128i v_fdx = _mm_set1_epi32(fdx*4);
|
||||
__m128i v_fx = _mm_setr_epi32(fx, fx + fdx, fx + fdx + fdx, fx + fdx + fdx + fdx);
|
||||
for (; i < len-3; i+=4) {
|
||||
for (; i < fastLen; i += 4) {
|
||||
int offset = _mm_extract_epi16(v_fx, 1);
|
||||
sbuf1[i * 2 + 0] = ((const uint*)s1)[offset];
|
||||
sbuf1[i * 2 + 1] = ((const uint*)s1)[offset + 1];
|
||||
|
@ -208,13 +208,13 @@
|
||||
#define ONE_PIXEL ( 1L << PIXEL_BITS )
|
||||
#define PIXEL_MASK ( -1L << PIXEL_BITS )
|
||||
#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) )
|
||||
#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS )
|
||||
#define SUBPIXELS( x ) ( (TPos)(x) * ( 1 << PIXEL_BITS ) )
|
||||
#define FLOOR( x ) ( (x) & -ONE_PIXEL )
|
||||
#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL )
|
||||
#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL )
|
||||
|
||||
#if PIXEL_BITS >= 6
|
||||
#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) )
|
||||
#define UPSCALE( x ) ( (x) * ( 1 << ( PIXEL_BITS - 6 ) ) )
|
||||
#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) )
|
||||
#else
|
||||
#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) )
|
||||
|
@ -62,7 +62,7 @@ class QBlittable;
|
||||
|
||||
class Q_GUI_EXPORT QBlitterPaintEngine : public QRasterPaintEngine
|
||||
{
|
||||
Q_DECLARE_PRIVATE(QBlitterPaintEngine);
|
||||
Q_DECLARE_PRIVATE(QBlitterPaintEngine)
|
||||
public:
|
||||
QBlitterPaintEngine(QBlittablePlatformPixmap *p);
|
||||
|
||||
|
@ -53,7 +53,7 @@ QT_BEGIN_NAMESPACE
|
||||
typedef int Q16Dot16;
|
||||
#define Q16Dot16ToFloat(i) ((i)/65536.)
|
||||
#define FloatToQ16Dot16(i) (int)((i) * 65536.)
|
||||
#define IntToQ16Dot16(i) ((i) << 16)
|
||||
#define IntToQ16Dot16(i) ((i) * (1 << 16))
|
||||
#define Q16Dot16ToInt(i) ((i) >> 16)
|
||||
#define Q16Dot16Factor 65536
|
||||
|
||||
@ -612,7 +612,7 @@ void QScanConverter::mergeLine(QT_FT_Vector a, QT_FT_Vector b)
|
||||
int iBottom = qMin(m_bottom, int((b.y - 32 - rounding) >> 6));
|
||||
|
||||
if (iTop <= iBottom) {
|
||||
Q16Dot16 aFP = Q16Dot16Factor/2 + (a.x << 10) - rounding;
|
||||
Q16Dot16 aFP = Q16Dot16Factor/2 + (a.x * (1 << 10)) - rounding;
|
||||
|
||||
if (b.x == a.x) {
|
||||
Line line = { qBound(m_leftFP, aFP, m_rightFP), 0, iTop, iBottom, winding };
|
||||
@ -624,7 +624,7 @@ void QScanConverter::mergeLine(QT_FT_Vector a, QT_FT_Vector b)
|
||||
|
||||
Q16Dot16 xFP = aFP + Q16Dot16Multiply(slopeFP,
|
||||
IntToQ16Dot16(iTop)
|
||||
+ Q16Dot16Factor/2 - (a.y << 10));
|
||||
+ Q16Dot16Factor/2 - (a.y * (1 << 10)));
|
||||
|
||||
if (clip(xFP, iTop, iBottom, slopeFP, m_leftFP, winding))
|
||||
return;
|
||||
|
@ -1827,7 +1827,7 @@ glyph_metrics_t QFontEngineFT::alphaMapBoundingBox(glyph_t glyph, QFixed subPixe
|
||||
|
||||
static inline QImage alphaMapFromGlyphData(QFontEngineFT::Glyph *glyph, QFontEngine::GlyphFormat glyphFormat)
|
||||
{
|
||||
if (glyph == Q_NULLPTR)
|
||||
if (glyph == Q_NULLPTR || glyph->height == 0 || glyph->width == 0)
|
||||
return QImage();
|
||||
|
||||
QImage::Format format = QImage::Format_Invalid;
|
||||
@ -1875,11 +1875,15 @@ QImage *QFontEngineFT::lockedAlphaMapForGlyph(glyph_t glyphIndex, QFixed subPixe
|
||||
|
||||
currentlyLockedAlphaMap = alphaMapFromGlyphData(glyph, neededFormat);
|
||||
|
||||
const bool glyphHasGeometry = glyph != Q_NULLPTR && glyph->height != 0 && glyph->width != 0;
|
||||
if (!cacheEnabled && glyph != &emptyGlyph) {
|
||||
currentlyLockedAlphaMap = currentlyLockedAlphaMap.copy();
|
||||
delete glyph;
|
||||
}
|
||||
|
||||
if (!glyphHasGeometry)
|
||||
return Q_NULLPTR;
|
||||
|
||||
if (currentlyLockedAlphaMap.isNull())
|
||||
return QFontEngine::lockedAlphaMapForGlyph(glyphIndex, subPixelPosition, neededFormat, t, offset);
|
||||
|
||||
|
@ -245,8 +245,8 @@ void QLocalSocket::connectToServer(OpenMode openMode)
|
||||
QLatin1String("QLocalSocket::connectToServer"));
|
||||
return;
|
||||
}
|
||||
d->tcpSocket->connectToHost(QHostAddress::LocalHost, port, openMode);
|
||||
QIODevice::open(openMode);
|
||||
d->tcpSocket->connectToHost(QHostAddress::LocalHost, port, openMode);
|
||||
}
|
||||
|
||||
bool QLocalSocket::setSocketDescriptor(qintptr socketDescriptor,
|
||||
|
@ -74,7 +74,7 @@ public:
|
||||
private:
|
||||
SSLContextRef context;
|
||||
|
||||
Q_DISABLE_COPY(QSecureTransportContext);
|
||||
Q_DISABLE_COPY(QSecureTransportContext)
|
||||
};
|
||||
|
||||
class QSslSocketBackendPrivate : public QSslSocketPrivate
|
||||
@ -121,7 +121,7 @@ private:
|
||||
|
||||
QSecureTransportContext context;
|
||||
|
||||
Q_DISABLE_COPY(QSslSocketBackendPrivate);
|
||||
Q_DISABLE_COPY(QSslSocketBackendPrivate)
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -60,7 +60,8 @@ void QAndroidPlatformFontDatabase::populateFontDatabase()
|
||||
|
||||
QStringList nameFilters;
|
||||
nameFilters << QLatin1String("*.ttf")
|
||||
<< QLatin1String("*.otf");
|
||||
<< QLatin1String("*.otf")
|
||||
<< QLatin1String("*.ttc");
|
||||
|
||||
const auto entries = dir.entryInfoList(nameFilters, QDir::Files);
|
||||
for (const QFileInfo &fi : entries) {
|
||||
|
@ -93,9 +93,23 @@ void QEglFSBrcmIntegration::platformInit()
|
||||
bcm_host_init();
|
||||
}
|
||||
|
||||
static int getDisplayId()
|
||||
{
|
||||
// As defined in vc_dispmanx_types.h
|
||||
// DISPMANX_ID_MAIN_LCD 0
|
||||
// DISPMANX_ID_AUX_LCD 1
|
||||
// DISPMANX_ID_HDMI 2
|
||||
// DISPMANX_ID_SDTV 3
|
||||
// DISPMANX_ID_FORCE_LCD 4
|
||||
// DISPMANX_ID_FORCE_TV 5
|
||||
// DISPMANX_ID_FORCE_OTHER 6 /* non-default display */
|
||||
static const int dispmanxId = qEnvironmentVariableIntValue("QT_QPA_EGLFS_DISPMANX_ID");
|
||||
return (dispmanxId >= 0 && dispmanxId <= 6) ? dispmanxId : 0;
|
||||
}
|
||||
|
||||
EGLNativeDisplayType QEglFSBrcmIntegration::platformDisplay() const
|
||||
{
|
||||
dispman_display = vc_dispmanx_display_open(0/* LCD */);
|
||||
dispman_display = vc_dispmanx_display_open(getDisplayId());
|
||||
return EGL_DEFAULT_DISPLAY;
|
||||
}
|
||||
|
||||
@ -107,7 +121,7 @@ void QEglFSBrcmIntegration::platformDestroy()
|
||||
QSize QEglFSBrcmIntegration::screenSize() const
|
||||
{
|
||||
uint32_t width, height;
|
||||
graphics_get_display_size(0 /* LCD */, &width, &height);
|
||||
graphics_get_display_size(getDisplayId(), &width, &height);
|
||||
return QSize(width, height);
|
||||
}
|
||||
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include "qwindowswindow.h"
|
||||
#include "qwindowsinputcontext.h"
|
||||
|
||||
#include <QtGui/QGuiApplication>
|
||||
#include <QtGui/QWindow>
|
||||
#include <qpa/qwindowsysteminterface.h>
|
||||
#include <private/qguiapplication_p.h>
|
||||
@ -1078,6 +1079,21 @@ bool QWindowsKeyMapper::translateKeyEventInternal(QWindow *window, const MSG &ms
|
||||
if (PeekMessage(&wm_char, 0, charType, charType, PM_REMOVE)) {
|
||||
// Found a ?_CHAR
|
||||
uch = QChar(ushort(wm_char.wParam));
|
||||
if (uch.isHighSurrogate()) {
|
||||
m_lastHighSurrogate = uch;
|
||||
return true;
|
||||
} else if (uch.isLowSurrogate() && !m_lastHighSurrogate.isNull()) {
|
||||
if (QObject *focusObject = QGuiApplication::focusObject()) {
|
||||
const QChar chars[2] = {m_lastHighSurrogate, uch};
|
||||
QInputMethodEvent event;
|
||||
event.setCommitString(QString(chars, 2));
|
||||
QCoreApplication::sendEvent(focusObject, &event);
|
||||
}
|
||||
m_lastHighSurrogate = QChar();
|
||||
return true;
|
||||
} else {
|
||||
m_lastHighSurrogate = QChar();
|
||||
}
|
||||
if (msgType == WM_SYSKEYDOWN && uch.isLetter() && (msg.lParam & KF_ALTDOWN))
|
||||
uch = uch.toLower(); // (See doc of WM_SYSCHAR) Alt-letter
|
||||
if (!code && !uch.row())
|
||||
|
@ -103,6 +103,7 @@ private:
|
||||
void deleteLayouts();
|
||||
|
||||
QWindow *m_keyGrabber;
|
||||
QChar m_lastHighSurrogate;
|
||||
static const size_t NumKeyboardLayoutItems = 256;
|
||||
KeyboardLayoutItem keyLayout[NumKeyboardLayoutItems];
|
||||
};
|
||||
|
@ -701,7 +701,7 @@ void QMessageBoxPrivate::_q_clicked(QPlatformDialogHelper::StandardButton button
|
||||
|
||||
If the \l{QMessageBox::StandardButtons} {standard buttons} are not
|
||||
flexible enough for your message box, you can use the addButton()
|
||||
overload that takes a text and a ButtonRoleto to add custom
|
||||
overload that takes a text and a ButtonRole to add custom
|
||||
buttons. The ButtonRole is used by QMessageBox to determine the
|
||||
ordering of the buttons on screen (which varies according to the
|
||||
platform). You can test the value of clickedButton() after calling
|
||||
|
@ -788,8 +788,10 @@ void QAbstractItemView::setSelectionModel(QItemSelectionModel *selectionModel)
|
||||
QModelIndex oldCurrentIndex;
|
||||
|
||||
if (d->selectionModel) {
|
||||
oldSelection = d->selectionModel->selection();
|
||||
oldCurrentIndex = d->selectionModel->currentIndex();
|
||||
if (d->selectionModel->model() == selectionModel->model()) {
|
||||
oldSelection = d->selectionModel->selection();
|
||||
oldCurrentIndex = d->selectionModel->currentIndex();
|
||||
}
|
||||
|
||||
disconnect(d->selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
|
||||
this, SLOT(selectionChanged(QItemSelection,QItemSelection)));
|
||||
@ -3871,7 +3873,7 @@ void QAbstractItemView::doAutoScroll()
|
||||
int horizontalValue = horizontalScroll->value();
|
||||
|
||||
QPoint pos = d->viewport->mapFromGlobal(QCursor::pos());
|
||||
QRect area = static_cast<QAbstractItemView*>(d->viewport)->d_func()->clipRect(); // access QWidget private by bending C++ rules
|
||||
QRect area = QWidgetPrivate::get(d->viewport)->clipRect();
|
||||
|
||||
// do the scrolling if we are in the scroll margins
|
||||
if (pos.y() - area.top() < margin)
|
||||
|
@ -45,6 +45,9 @@
|
||||
#include <QtCore/qitemselectionmodel.h>
|
||||
#include <QtWidgets/qabstractitemdelegate.h>
|
||||
|
||||
class tst_QAbstractItemView;
|
||||
class tst_QTreeView;
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
||||
@ -367,6 +370,8 @@ private:
|
||||
Q_PRIVATE_SLOT(d_func(), void _q_scrollerStateChanged())
|
||||
#endif
|
||||
|
||||
friend class ::tst_QAbstractItemView;
|
||||
friend class ::tst_QTreeView;
|
||||
friend class QTreeViewPrivate; // needed to compile with MSVC
|
||||
friend class QListModeViewBase;
|
||||
friend class QListViewPrivate;
|
||||
|
@ -205,20 +205,6 @@ void QDataWidgetMapperPrivate::_q_commitData(QWidget *w)
|
||||
commit(widgetMap.at(idx));
|
||||
}
|
||||
|
||||
class QFocusHelper: public QWidget
|
||||
{
|
||||
public:
|
||||
bool focusNextPrevChild(bool next) Q_DECL_OVERRIDE
|
||||
{
|
||||
return QWidget::focusNextPrevChild(next);
|
||||
}
|
||||
|
||||
static inline void focusNextPrevChild(QWidget *w, bool next)
|
||||
{
|
||||
static_cast<QFocusHelper *>(w)->focusNextPrevChild(next);
|
||||
}
|
||||
};
|
||||
|
||||
void QDataWidgetMapperPrivate::_q_closeEditor(QWidget *w, QAbstractItemDelegate::EndEditHint hint)
|
||||
{
|
||||
int idx = findWidget(w);
|
||||
@ -230,10 +216,10 @@ void QDataWidgetMapperPrivate::_q_closeEditor(QWidget *w, QAbstractItemDelegate:
|
||||
populate(widgetMap[idx]);
|
||||
break; }
|
||||
case QAbstractItemDelegate::EditNextItem:
|
||||
QFocusHelper::focusNextPrevChild(w, true);
|
||||
w->focusNextChild();
|
||||
break;
|
||||
case QAbstractItemDelegate::EditPreviousItem:
|
||||
QFocusHelper::focusNextPrevChild(w, false);
|
||||
w->focusPreviousChild();
|
||||
break;
|
||||
case QAbstractItemDelegate::SubmitModelCache:
|
||||
case QAbstractItemDelegate::NoHint:
|
||||
|
@ -42,6 +42,8 @@
|
||||
|
||||
#include <QtWidgets/qabstractitemview.h>
|
||||
|
||||
class tst_QTreeView;
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
||||
@ -219,6 +221,7 @@ protected:
|
||||
void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) Q_DECL_OVERRIDE;
|
||||
|
||||
private:
|
||||
friend class ::tst_QTreeView;
|
||||
friend class QAccessibleTable;
|
||||
friend class QAccessibleTree;
|
||||
friend class QAccessibleTableCell;
|
||||
|
@ -146,6 +146,7 @@ QTreeModel::QTreeModel(QTreeModelPrivate &dd, QTreeWidget *parent)
|
||||
QTreeModel::~QTreeModel()
|
||||
{
|
||||
clear();
|
||||
headerItem->view = Q_NULLPTR;
|
||||
delete headerItem;
|
||||
rootItem->view = 0;
|
||||
delete rootItem;
|
||||
|
@ -675,6 +675,7 @@ protected:
|
||||
void destroy(bool destroyWindow = true,
|
||||
bool destroySubWindows = true);
|
||||
|
||||
friend class QDataWidgetMapperPrivate; // for access to focusNextPrevChild
|
||||
virtual bool focusNextPrevChild(bool next);
|
||||
inline bool focusNextChild() { return focusNextPrevChild(true); }
|
||||
inline bool focusPreviousChild() { return focusNextPrevChild(false); }
|
||||
|
@ -898,13 +898,11 @@ void tst_QUrl::resolving_data()
|
||||
|
||||
// Some parsers allow the scheme name to be present in a relative URI
|
||||
// reference if it is the same as the base URI scheme. This is
|
||||
// considered to be a loophole in prior specifications of partial URI
|
||||
// [RFC1630]. Its use should be avoided, but is allowed for backward
|
||||
// compatibility.
|
||||
// For strict parsers :
|
||||
// QTest::newRow("http:g [for strict parsers]") << QString::fromLatin1("http://a/b/c/d;p?q") << QString::fromLatin1("http:g") << QString::fromLatin1("http:g");
|
||||
// For backward compatibility :
|
||||
QTest::newRow("http:g [for backward compatibility]") << QString::fromLatin1("http://a/b/c/d;p?q") << QString::fromLatin1("http:g") << QString::fromLatin1("http://a/b/c/g");
|
||||
// considered to be a loophole in prior specifications of partial URI [RFC1630],
|
||||
//QTest::newRow("http:g [for backward compatibility]") << QString::fromLatin1("http://a/b/c/d;p?q") << QString::fromLatin1("http:g") << QString::fromLatin1("http://a/b/c/g");
|
||||
// However we don't do that anymore, as per RFC3986, in order for the data:subpage testcase below to work.
|
||||
QTest::newRow("http:g") << QString::fromLatin1("http://a/b/c/d;p?q") << QString::fromLatin1("http:g") << QString::fromLatin1("http:g");
|
||||
QTest::newRow("data:subpage") << QString::fromLatin1("data:text/plain, main page") << QString::fromLatin1("data:text/plain, subpage") << QString::fromLatin1("data:text/plain, subpage");
|
||||
|
||||
// Resolve relative with relative
|
||||
QTest::newRow("../a (1)") << QString::fromLatin1("b") << QString::fromLatin1("../a") << QString::fromLatin1("a");
|
||||
@ -916,6 +914,10 @@ void tst_QUrl::resolving_data()
|
||||
QTest::newRow("../a (6)") << QString::fromLatin1("/b/a") << QString::fromLatin1("../a") << QString::fromLatin1("/a");
|
||||
QTest::newRow("../a (7)") << QString::fromLatin1("/b/c/a") << QString::fromLatin1("../a") << QString::fromLatin1("/b/a");
|
||||
QTest::newRow("../a (8)") << QString::fromLatin1("/b") << QString::fromLatin1("/a") << QString::fromLatin1("/a");
|
||||
|
||||
// More tests from KDE
|
||||
QTest::newRow("brackets") << QString::fromLatin1("http://www.calorieking.com/personal/diary/") << QString::fromLatin1("/personal/diary/rpc.php?C=jsrs1&F=getDiaryDay&P0=[2006-3-8]&U=1141858921458") << QString::fromLatin1("http://www.calorieking.com/personal/diary/rpc.php?C=jsrs1&F=getDiaryDay&P0=[2006-3-8]&U=1141858921458");
|
||||
QTest::newRow("javascript")<< QString::fromLatin1("http://www.youtube.com/?v=JvOSnRD5aNk") << QString::fromLatin1("javascript:window.location+\"__flashplugin_unique__\"") << QString::fromLatin1("javascript:window.location+%22__flashplugin_unique__%22");
|
||||
}
|
||||
|
||||
void tst_QUrl::resolving()
|
||||
|
@ -143,6 +143,7 @@ private slots:
|
||||
void noMapAfterSourceDelete();
|
||||
void forwardDropApi();
|
||||
void canDropMimeData();
|
||||
void filterHint();
|
||||
|
||||
protected:
|
||||
void buildHierarchy(const QStringList &data, QAbstractItemModel *model);
|
||||
@ -3802,6 +3803,12 @@ void tst_QSortFilterProxyModel::moveSourceRows()
|
||||
QCOMPARE(filterBeforeParents.size(), 1);
|
||||
QCOMPARE(filterAfterParents.size(), 1);
|
||||
|
||||
QCOMPARE(
|
||||
filterBeforeParentLayoutSpy.first().at(1).value<QAbstractItemModel::LayoutChangeHint>(),
|
||||
QAbstractItemModel::NoLayoutChangeHint);
|
||||
QCOMPARE(filterAfterParentLayoutSpy.first().at(1).value<QAbstractItemModel::LayoutChangeHint>(),
|
||||
QAbstractItemModel::NoLayoutChangeHint);
|
||||
|
||||
QCOMPARE(filterBothBeforeParentLayoutSpy.size(), 0);
|
||||
QCOMPARE(filterBothAfterParentLayoutSpy.size(), 0);
|
||||
}
|
||||
@ -4123,5 +4130,50 @@ void tst_QSortFilterProxyModel::resortingDoesNotBreakTreeModels()
|
||||
QCOMPARE(proxy.rowCount(pi1), 1);
|
||||
}
|
||||
|
||||
void tst_QSortFilterProxyModel::filterHint()
|
||||
{
|
||||
// test that a filtering model does not emit layoutChanged with a hint
|
||||
QStringListModel model(QStringList() << "one"
|
||||
<< "two"
|
||||
<< "three"
|
||||
<< "four"
|
||||
<< "five"
|
||||
<< "six");
|
||||
QSortFilterProxyModel proxy1;
|
||||
proxy1.setSourceModel(&model);
|
||||
proxy1.setSortRole(Qt::DisplayRole);
|
||||
proxy1.setDynamicSortFilter(true);
|
||||
proxy1.sort(0);
|
||||
|
||||
QSortFilterProxyModel proxy2;
|
||||
proxy2.setSourceModel(&proxy1);
|
||||
proxy2.setFilterRole(Qt::DisplayRole);
|
||||
proxy2.setFilterRegExp("^[^ ]*$");
|
||||
proxy2.setDynamicSortFilter(true);
|
||||
|
||||
QSignalSpy proxy1BeforeSpy(&proxy1, &QSortFilterProxyModel::layoutAboutToBeChanged);
|
||||
QSignalSpy proxy1AfterSpy(&proxy1, &QSortFilterProxyModel::layoutChanged);
|
||||
QSignalSpy proxy2BeforeSpy(&proxy2, &QSortFilterProxyModel::layoutAboutToBeChanged);
|
||||
QSignalSpy proxy2AfterSpy(&proxy2, &QSortFilterProxyModel::layoutChanged);
|
||||
|
||||
model.setData(model.index(2), QStringLiteral("modified three"), Qt::DisplayRole);
|
||||
|
||||
// The first proxy was re-sorted as one item as changed.
|
||||
QCOMPARE(proxy1BeforeSpy.size(), 1);
|
||||
QCOMPARE(proxy1BeforeSpy.first().at(1).value<QAbstractItemModel::LayoutChangeHint>(),
|
||||
QAbstractItemModel::VerticalSortHint);
|
||||
QCOMPARE(proxy1AfterSpy.size(), 1);
|
||||
QCOMPARE(proxy1AfterSpy.first().at(1).value<QAbstractItemModel::LayoutChangeHint>(),
|
||||
QAbstractItemModel::VerticalSortHint);
|
||||
|
||||
// But the second proxy must not have the VerticalSortHint since an item was filtered
|
||||
QCOMPARE(proxy2BeforeSpy.size(), 1);
|
||||
QCOMPARE(proxy2BeforeSpy.first().at(1).value<QAbstractItemModel::LayoutChangeHint>(),
|
||||
QAbstractItemModel::NoLayoutChangeHint);
|
||||
QCOMPARE(proxy2AfterSpy.size(), 1);
|
||||
QCOMPARE(proxy2AfterSpy.first().at(1).value<QAbstractItemModel::LayoutChangeHint>(),
|
||||
QAbstractItemModel::NoLayoutChangeHint);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QSortFilterProxyModel)
|
||||
#include "tst_qsortfilterproxymodel.moc"
|
||||
|
@ -275,6 +275,7 @@ private slots:
|
||||
void metaEnums();
|
||||
void compareSanity_data();
|
||||
void compareSanity();
|
||||
void compareRich();
|
||||
|
||||
void accessSequentialContainerKey();
|
||||
|
||||
@ -4775,6 +4776,60 @@ void tst_QVariant::compareSanity()
|
||||
}
|
||||
}
|
||||
|
||||
static void richComparison(const QVariant& less, const QVariant& more)
|
||||
{
|
||||
QVERIFY(less.type() == more.type());
|
||||
|
||||
QVERIFY(less < more);
|
||||
QVERIFY(!(more < less));
|
||||
|
||||
QVERIFY(more > less);
|
||||
QVERIFY(!(less > more));
|
||||
|
||||
QVERIFY(less <= more);
|
||||
QVERIFY(!(more <= less));
|
||||
QVERIFY(less <= less);
|
||||
|
||||
QVERIFY(more >= less);
|
||||
QVERIFY(!(less >= more));
|
||||
QVERIFY(more >= more);
|
||||
}
|
||||
|
||||
void tst_QVariant::compareRich()
|
||||
{
|
||||
richComparison(QUuid("{49d8ad2a-2ee8-4c3d-949f-1b5a3765ddf0}"),
|
||||
QUuid("{f6d56824-16e9-4543-a375-add2877c2d05}"));
|
||||
richComparison(QByteArray::fromRawData("a", 1),
|
||||
QByteArray::fromRawData("b", 1));
|
||||
richComparison(QStringLiteral("a"), QStringLiteral("b"));
|
||||
richComparison(QLatin1String("a"), QLatin1String("b"));
|
||||
richComparison(QChar('a'), QChar('b'));
|
||||
richComparison(QDate(2016, 7, 23), QDate(2016, 7, 24));
|
||||
richComparison(QTime(0, 0), QTime(0, 1));
|
||||
richComparison(QDateTime(QDate(2016, 7, 23), QTime(0, 0)),
|
||||
QDateTime(QDate(2016, 7, 23), QTime(0, 1)));
|
||||
|
||||
richComparison(QStringList(), QStringList() << QStringLiteral("a"));
|
||||
richComparison(QStringList(), QStringList() << QStringLiteral("a")
|
||||
<< QStringLiteral("b"));
|
||||
richComparison(QStringList() << QStringLiteral("a"),
|
||||
QStringList() << QStringLiteral("b"));
|
||||
richComparison(QStringList() << QStringLiteral("a"),
|
||||
QStringList() << QStringLiteral("b")
|
||||
<< QStringLiteral("c"));
|
||||
richComparison(QStringList() << QStringLiteral("a")
|
||||
<< QStringLiteral("c"),
|
||||
QStringList() << QStringLiteral("b"));
|
||||
richComparison(QStringList() << QStringLiteral("a")
|
||||
<< QStringLiteral("c"),
|
||||
QStringList() << QStringLiteral("b")
|
||||
<< QStringLiteral("d"));
|
||||
richComparison(QStringList() << QStringLiteral("a")
|
||||
<< QStringLiteral("c"),
|
||||
QStringList() << QStringLiteral("a")
|
||||
<< QStringLiteral("d"));
|
||||
}
|
||||
|
||||
void tst_QVariant::accessSequentialContainerKey()
|
||||
{
|
||||
QString nameResult;
|
||||
|
@ -127,7 +127,7 @@ template <>
|
||||
class Arg<QStringRef> : ArgBase
|
||||
{
|
||||
QStringRef ref() const
|
||||
{ return this->pinned.isNull() ? QStringRef() : this->pinned.midRef(0) ; }
|
||||
{ return QStringRef(&pinned); }
|
||||
public:
|
||||
explicit Arg(const char *str) : ArgBase(str) {}
|
||||
|
||||
|
@ -181,6 +181,7 @@ private slots:
|
||||
void slotConnected()
|
||||
{
|
||||
QCOMPARE(state(), QLocalSocket::ConnectedState);
|
||||
QVERIFY(isOpen());
|
||||
}
|
||||
void slotDisconnected()
|
||||
{
|
||||
|
@ -77,108 +77,6 @@ static inline void moveCursorAway(const QWidget *topLevel)
|
||||
#endif
|
||||
}
|
||||
|
||||
class TestView : public QAbstractItemView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
inline void tst_dataChanged(const QModelIndex &tl, const QModelIndex &br)
|
||||
{ dataChanged(tl, br); }
|
||||
inline void tst_setHorizontalStepsPerItem(int steps)
|
||||
{ setHorizontalStepsPerItem(steps); }
|
||||
inline int tst_horizontalStepsPerItem() const
|
||||
{ return horizontalStepsPerItem(); }
|
||||
inline void tst_setVerticalStepsPerItem(int steps)
|
||||
{ setVerticalStepsPerItem(steps); }
|
||||
inline int tst_verticalStepsPerItem() const
|
||||
{ return verticalStepsPerItem(); }
|
||||
|
||||
inline void tst_rowsInserted(const QModelIndex &parent, int start, int end)
|
||||
{ rowsInserted(parent, start, end); }
|
||||
inline void tst_rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
|
||||
{ rowsAboutToBeRemoved(parent, start, end); }
|
||||
inline void tst_selectionChanged(const QItemSelection &selected,
|
||||
const QItemSelection &deselected)
|
||||
{ selectionChanged(selected, deselected); }
|
||||
inline void tst_currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
|
||||
{ currentChanged(current, previous); }
|
||||
inline void tst_updateEditorData()
|
||||
{ updateEditorData(); }
|
||||
inline void tst_updateEditorGeometries()
|
||||
{ updateEditorGeometries(); }
|
||||
inline void tst_updateGeometries()
|
||||
{ updateGeometries(); }
|
||||
inline void tst_verticalScrollbarAction(int action)
|
||||
{ verticalScrollbarAction(action); }
|
||||
inline void tst_horizontalScrollbarAction(int action)
|
||||
{ horizontalScrollbarAction(action); }
|
||||
inline void tst_verticalScrollbarValueChanged(int value)
|
||||
{ verticalScrollbarValueChanged(value); }
|
||||
inline void tst_horizontalScrollbarValueChanged(int value)
|
||||
{ horizontalScrollbarValueChanged(value); }
|
||||
inline void tst_closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint)
|
||||
{ closeEditor(editor, hint); }
|
||||
inline void tst_commitData(QWidget *editor)
|
||||
{ commitData(editor); }
|
||||
inline void tst_editorDestroyed(QObject *editor)
|
||||
{ editorDestroyed(editor); }
|
||||
enum tst_CursorAction {
|
||||
MoveUp = QAbstractItemView::MoveUp,
|
||||
MoveDown = QAbstractItemView::MoveDown,
|
||||
MoveLeft = QAbstractItemView::MoveLeft,
|
||||
MoveRight = QAbstractItemView::MoveRight,
|
||||
MoveHome = QAbstractItemView::MoveHome,
|
||||
MoveEnd = QAbstractItemView::MoveEnd,
|
||||
MovePageUp = QAbstractItemView::MovePageUp,
|
||||
MovePageDown = QAbstractItemView::MovePageDown,
|
||||
MoveNext = QAbstractItemView::MoveNext,
|
||||
MovePrevious = QAbstractItemView::MovePrevious
|
||||
};
|
||||
inline QModelIndex tst_moveCursor(tst_CursorAction cursorAction,
|
||||
Qt::KeyboardModifiers modifiers)
|
||||
{ return moveCursor(QAbstractItemView::CursorAction(cursorAction), modifiers); }
|
||||
inline int tst_horizontalOffset() const
|
||||
{ return horizontalOffset(); }
|
||||
inline int tst_verticalOffset() const
|
||||
{ return verticalOffset(); }
|
||||
inline bool tst_isIndexHidden(const QModelIndex &index) const
|
||||
{ return isIndexHidden(index); }
|
||||
inline void tst_setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command)
|
||||
{ setSelection(rect, command); }
|
||||
inline QRegion tst_visualRegionForSelection(const QItemSelection &selection) const
|
||||
{ return visualRegionForSelection(selection); }
|
||||
inline QModelIndexList tst_selectedIndexes() const
|
||||
{ return selectedIndexes(); }
|
||||
inline bool tst_edit(const QModelIndex &index, EditTrigger trigger, QEvent *event)
|
||||
{ return edit(index, trigger, event); }
|
||||
inline QItemSelectionModel::SelectionFlags tst_selectionCommand(const QModelIndex &index,
|
||||
const QEvent *event = 0) const
|
||||
{ return selectionCommand(index, event); }
|
||||
#ifndef QT_NO_DRAGANDDROP
|
||||
inline void tst_startDrag(Qt::DropActions supportedActions)
|
||||
{ startDrag(supportedActions); }
|
||||
#endif
|
||||
inline QStyleOptionViewItem tst_viewOptions() const
|
||||
{ return viewOptions(); }
|
||||
enum tst_State {
|
||||
NoState = QAbstractItemView::NoState,
|
||||
DraggingState = QAbstractItemView::DraggingState,
|
||||
DragSelectingState = QAbstractItemView::DragSelectingState,
|
||||
EditingState = QAbstractItemView::EditingState,
|
||||
ExpandingState = QAbstractItemView::ExpandingState,
|
||||
CollapsingState = QAbstractItemView::CollapsingState
|
||||
};
|
||||
inline tst_State tst_state() const
|
||||
{ return (tst_State)state(); }
|
||||
inline void tst_setState(tst_State state)
|
||||
{ setState(QAbstractItemView::State(state)); }
|
||||
inline void tst_startAutoScroll()
|
||||
{ startAutoScroll(); }
|
||||
inline void tst_stopAutoScroll()
|
||||
{ stopAutoScroll(); }
|
||||
inline void tst_doAutoScroll()
|
||||
{ doAutoScroll(); }
|
||||
};
|
||||
|
||||
class GeometriesTestView : public QTableView
|
||||
{
|
||||
Q_OBJECT
|
||||
@ -194,7 +92,7 @@ class tst_QAbstractItemView : public QObject
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
void basic_tests(TestView *view);
|
||||
void basic_tests(QAbstractItemView *view);
|
||||
|
||||
private slots:
|
||||
void initTestCase();
|
||||
@ -279,7 +177,7 @@ public:
|
||||
void tst_QAbstractItemView::getSetCheck()
|
||||
{
|
||||
QListView view;
|
||||
TestView *obj1 = reinterpret_cast<TestView*>(&view);
|
||||
QAbstractItemView *obj1 = &view;
|
||||
// QAbstractItemDelegate * QAbstractItemView::itemDelegate()
|
||||
// void QAbstractItemView::setItemDelegate(QAbstractItemDelegate *)
|
||||
MyAbstractItemDelegate *var1 = new MyAbstractItemDelegate;
|
||||
@ -330,18 +228,18 @@ void tst_QAbstractItemView::getSetCheck()
|
||||
|
||||
// State QAbstractItemView::state()
|
||||
// void QAbstractItemView::setState(State)
|
||||
obj1->tst_setState(TestView::tst_State(TestView::NoState));
|
||||
QCOMPARE(TestView::tst_State(TestView::NoState), obj1->tst_state());
|
||||
obj1->tst_setState(TestView::tst_State(TestView::DraggingState));
|
||||
QCOMPARE(TestView::tst_State(TestView::DraggingState), obj1->tst_state());
|
||||
obj1->tst_setState(TestView::tst_State(TestView::DragSelectingState));
|
||||
QCOMPARE(TestView::tst_State(TestView::DragSelectingState), obj1->tst_state());
|
||||
obj1->tst_setState(TestView::tst_State(TestView::EditingState));
|
||||
QCOMPARE(TestView::tst_State(TestView::EditingState), obj1->tst_state());
|
||||
obj1->tst_setState(TestView::tst_State(TestView::ExpandingState));
|
||||
QCOMPARE(TestView::tst_State(TestView::ExpandingState), obj1->tst_state());
|
||||
obj1->tst_setState(TestView::tst_State(TestView::CollapsingState));
|
||||
QCOMPARE(TestView::tst_State(TestView::CollapsingState), obj1->tst_state());
|
||||
obj1->setState(QAbstractItemView::NoState);
|
||||
QCOMPARE(QAbstractItemView::NoState, obj1->state());
|
||||
obj1->setState(QAbstractItemView::DraggingState);
|
||||
QCOMPARE(QAbstractItemView::DraggingState, obj1->state());
|
||||
obj1->setState(QAbstractItemView::DragSelectingState);
|
||||
QCOMPARE(QAbstractItemView::DragSelectingState, obj1->state());
|
||||
obj1->setState(QAbstractItemView::EditingState);
|
||||
QCOMPARE(QAbstractItemView::EditingState, obj1->state());
|
||||
obj1->setState(QAbstractItemView::ExpandingState);
|
||||
QCOMPARE(QAbstractItemView::ExpandingState, obj1->state());
|
||||
obj1->setState(QAbstractItemView::CollapsingState);
|
||||
QCOMPARE(QAbstractItemView::CollapsingState, obj1->state());
|
||||
|
||||
// QWidget QAbstractScrollArea::viewport()
|
||||
// void setViewport(QWidget*)
|
||||
@ -402,7 +300,7 @@ void tst_QAbstractItemView::emptyModels()
|
||||
QVERIFY(!view->selectionModel());
|
||||
//QVERIFY(view->itemDelegate() != 0);
|
||||
|
||||
basic_tests(reinterpret_cast<TestView*>(view.data()));
|
||||
basic_tests(view.data());
|
||||
}
|
||||
|
||||
void tst_QAbstractItemView::setModel_data()
|
||||
@ -439,10 +337,10 @@ void tst_QAbstractItemView::setModel()
|
||||
QStandardItemModel model(20,20);
|
||||
view->setModel(0);
|
||||
view->setModel(&model);
|
||||
basic_tests(reinterpret_cast<TestView*>(view.data()));
|
||||
basic_tests(view.data());
|
||||
}
|
||||
|
||||
void tst_QAbstractItemView::basic_tests(TestView *view)
|
||||
void tst_QAbstractItemView::basic_tests(QAbstractItemView *view)
|
||||
{
|
||||
// setSelectionModel
|
||||
// Will assert as it should
|
||||
@ -567,73 +465,73 @@ void tst_QAbstractItemView::basic_tests(TestView *view)
|
||||
view->setCurrentIndex(QModelIndex());
|
||||
|
||||
// protected methods
|
||||
view->tst_dataChanged(QModelIndex(), QModelIndex());
|
||||
view->tst_rowsInserted(QModelIndex(), -1, -1);
|
||||
view->tst_rowsAboutToBeRemoved(QModelIndex(), -1, -1);
|
||||
view->tst_selectionChanged(QItemSelection(), QItemSelection());
|
||||
view->dataChanged(QModelIndex(), QModelIndex());
|
||||
view->rowsInserted(QModelIndex(), -1, -1);
|
||||
view->rowsAboutToBeRemoved(QModelIndex(), -1, -1);
|
||||
view->selectionChanged(QItemSelection(), QItemSelection());
|
||||
if (view->model()){
|
||||
view->tst_currentChanged(QModelIndex(), QModelIndex());
|
||||
view->tst_currentChanged(QModelIndex(), view->model()->index(0,0));
|
||||
view->currentChanged(QModelIndex(), QModelIndex());
|
||||
view->currentChanged(QModelIndex(), view->model()->index(0,0));
|
||||
}
|
||||
view->tst_updateEditorData();
|
||||
view->tst_updateEditorGeometries();
|
||||
view->tst_updateGeometries();
|
||||
view->tst_verticalScrollbarAction(QAbstractSlider::SliderSingleStepAdd);
|
||||
view->tst_horizontalScrollbarAction(QAbstractSlider::SliderSingleStepAdd);
|
||||
view->tst_verticalScrollbarValueChanged(10);
|
||||
view->tst_horizontalScrollbarValueChanged(10);
|
||||
view->tst_closeEditor(0, QAbstractItemDelegate::NoHint);
|
||||
view->tst_commitData(0);
|
||||
view->tst_editorDestroyed(0);
|
||||
view->updateEditorData();
|
||||
view->updateEditorGeometries();
|
||||
view->updateGeometries();
|
||||
view->verticalScrollbarAction(QAbstractSlider::SliderSingleStepAdd);
|
||||
view->horizontalScrollbarAction(QAbstractSlider::SliderSingleStepAdd);
|
||||
view->verticalScrollbarValueChanged(10);
|
||||
view->horizontalScrollbarValueChanged(10);
|
||||
view->closeEditor(0, QAbstractItemDelegate::NoHint);
|
||||
view->commitData(0);
|
||||
view->editorDestroyed(0);
|
||||
|
||||
view->tst_setHorizontalStepsPerItem(2);
|
||||
view->tst_horizontalStepsPerItem();
|
||||
view->tst_setVerticalStepsPerItem(2);
|
||||
view->tst_verticalStepsPerItem();
|
||||
view->setHorizontalStepsPerItem(2);
|
||||
view->horizontalStepsPerItem();
|
||||
view->setVerticalStepsPerItem(2);
|
||||
view->verticalStepsPerItem();
|
||||
|
||||
// Will assert as it should
|
||||
// view->setIndexWidget(QModelIndex(), 0);
|
||||
|
||||
view->tst_moveCursor(TestView::MoveUp, Qt::NoModifier);
|
||||
view->tst_horizontalOffset();
|
||||
view->tst_verticalOffset();
|
||||
view->moveCursor(QAbstractItemView::MoveUp, Qt::NoModifier);
|
||||
view->horizontalOffset();
|
||||
view->verticalOffset();
|
||||
|
||||
// view->tst_isIndexHidden(QModelIndex()); // will (correctly) assert
|
||||
// view->isIndexHidden(QModelIndex()); // will (correctly) assert
|
||||
if(view->model())
|
||||
view->tst_isIndexHidden(view->model()->index(0,0));
|
||||
view->isIndexHidden(view->model()->index(0,0));
|
||||
|
||||
view->tst_setSelection(QRect(0, 0, 10, 10), QItemSelectionModel::ClearAndSelect);
|
||||
view->tst_setSelection(QRect(-1, -1, -1, -1), QItemSelectionModel::ClearAndSelect);
|
||||
view->tst_visualRegionForSelection(QItemSelection());
|
||||
view->tst_selectedIndexes();
|
||||
view->setSelection(QRect(0, 0, 10, 10), QItemSelectionModel::ClearAndSelect);
|
||||
view->setSelection(QRect(-1, -1, -1, -1), QItemSelectionModel::ClearAndSelect);
|
||||
view->visualRegionForSelection(QItemSelection());
|
||||
view->selectedIndexes();
|
||||
|
||||
view->tst_edit(QModelIndex(), QAbstractItemView::NoEditTriggers, 0);
|
||||
view->edit(QModelIndex(), QAbstractItemView::NoEditTriggers, 0);
|
||||
|
||||
view->tst_selectionCommand(QModelIndex(), 0);
|
||||
view->selectionCommand(QModelIndex(), 0);
|
||||
|
||||
#ifndef QT_NO_DRAGANDDROP
|
||||
if (!view->model())
|
||||
view->tst_startDrag(Qt::CopyAction);
|
||||
view->startDrag(Qt::CopyAction);
|
||||
|
||||
view->tst_viewOptions();
|
||||
view->viewOptions();
|
||||
|
||||
view->tst_setState(TestView::NoState);
|
||||
QVERIFY(view->tst_state()==TestView::NoState);
|
||||
view->tst_setState(TestView::DraggingState);
|
||||
QVERIFY(view->tst_state()==TestView::DraggingState);
|
||||
view->tst_setState(TestView::DragSelectingState);
|
||||
QVERIFY(view->tst_state()==TestView::DragSelectingState);
|
||||
view->tst_setState(TestView::EditingState);
|
||||
QVERIFY(view->tst_state()==TestView::EditingState);
|
||||
view->tst_setState(TestView::ExpandingState);
|
||||
QVERIFY(view->tst_state()==TestView::ExpandingState);
|
||||
view->tst_setState(TestView::CollapsingState);
|
||||
QVERIFY(view->tst_state()==TestView::CollapsingState);
|
||||
view->setState(QAbstractItemView::NoState);
|
||||
QVERIFY(view->state()==QAbstractItemView::NoState);
|
||||
view->setState(QAbstractItemView::DraggingState);
|
||||
QVERIFY(view->state()==QAbstractItemView::DraggingState);
|
||||
view->setState(QAbstractItemView::DragSelectingState);
|
||||
QVERIFY(view->state()==QAbstractItemView::DragSelectingState);
|
||||
view->setState(QAbstractItemView::EditingState);
|
||||
QVERIFY(view->state()==QAbstractItemView::EditingState);
|
||||
view->setState(QAbstractItemView::ExpandingState);
|
||||
QVERIFY(view->state()==QAbstractItemView::ExpandingState);
|
||||
view->setState(QAbstractItemView::CollapsingState);
|
||||
QVERIFY(view->state()==QAbstractItemView::CollapsingState);
|
||||
#endif
|
||||
|
||||
view->tst_startAutoScroll();
|
||||
view->tst_stopAutoScroll();
|
||||
view->tst_doAutoScroll();
|
||||
view->startAutoScroll();
|
||||
view->stopAutoScroll();
|
||||
view->doAutoScroll();
|
||||
|
||||
// testing mouseFoo and key functions
|
||||
// QTest::mousePress(view, Qt::LeftButton, Qt::NoModifier, QPoint(0,0));
|
||||
@ -768,11 +666,11 @@ void tst_QAbstractItemView::selectAll()
|
||||
QTableView view;
|
||||
view.setModel(&model);
|
||||
|
||||
TestView *tst_view = (TestView*)&view;
|
||||
QAbstractItemView *tst_view = &view;
|
||||
|
||||
QCOMPARE(tst_view->tst_selectedIndexes().count(), 0);
|
||||
QCOMPARE(tst_view->selectedIndexes().count(), 0);
|
||||
view.selectAll();
|
||||
QCOMPARE(tst_view->tst_selectedIndexes().count(), 4*4);
|
||||
QCOMPARE(tst_view->selectedIndexes().count(), 4*4);
|
||||
}
|
||||
|
||||
void tst_QAbstractItemView::ctrlA()
|
||||
@ -781,11 +679,11 @@ void tst_QAbstractItemView::ctrlA()
|
||||
QTableView view;
|
||||
view.setModel(&model);
|
||||
|
||||
TestView *tst_view = (TestView*)&view;
|
||||
QAbstractItemView *tst_view = &view;
|
||||
|
||||
QCOMPARE(tst_view->tst_selectedIndexes().count(), 0);
|
||||
QCOMPARE(tst_view->selectedIndexes().count(), 0);
|
||||
QTest::keyClick(&view, Qt::Key_A, Qt::ControlModifier);
|
||||
QCOMPARE(tst_view->tst_selectedIndexes().count(), 4*4);
|
||||
QCOMPARE(tst_view->selectedIndexes().count(), 4*4);
|
||||
}
|
||||
|
||||
void tst_QAbstractItemView::persistentEditorFocus()
|
||||
@ -1601,9 +1499,9 @@ void tst_QAbstractItemView::testDelegateDestroyEditor()
|
||||
MyAbstractItemDelegate delegate;
|
||||
table.setItemDelegate(&delegate);
|
||||
table.edit(table.model()->index(1, 1));
|
||||
TestView *tv = reinterpret_cast<TestView*>(&table);
|
||||
QAbstractItemView *tv = &table;
|
||||
QVERIFY(!delegate.calledVirtualDtor);
|
||||
tv->tst_closeEditor(delegate.openedEditor, QAbstractItemDelegate::NoHint);
|
||||
tv->closeEditor(delegate.openedEditor, QAbstractItemDelegate::NoHint);
|
||||
QVERIFY(delegate.calledVirtualDtor);
|
||||
}
|
||||
|
||||
@ -2080,11 +1978,18 @@ void tst_QAbstractItemView::QTBUG50535_update_on_new_selection_model()
|
||||
{
|
||||
public:
|
||||
ListView()
|
||||
: m_paintEventsCount(0)
|
||||
: m_paintEventsCount(0), m_deselectedMustBeEmpty(false), m_selectionChangedOk(true)
|
||||
{
|
||||
}
|
||||
|
||||
void setSelectionModel(QItemSelectionModel *model) Q_DECL_OVERRIDE
|
||||
{
|
||||
m_deselectedMustBeEmpty = !selectionModel() || !model || selectionModel()->model() != model->model();
|
||||
QListView::setSelectionModel(model);
|
||||
m_deselectedMustBeEmpty = false;
|
||||
}
|
||||
int m_paintEventsCount;
|
||||
bool selectionChangedOk() const { return m_selectionChangedOk; }
|
||||
|
||||
protected:
|
||||
bool viewportEvent(QEvent *event) Q_DECL_OVERRIDE
|
||||
@ -2093,6 +1998,24 @@ void tst_QAbstractItemView::QTBUG50535_update_on_new_selection_model()
|
||||
++m_paintEventsCount;
|
||||
return QListView::viewportEvent(event);
|
||||
}
|
||||
|
||||
void selectionChanged(const QItemSelection &selected,
|
||||
const QItemSelection &deselected) Q_DECL_OVERRIDE
|
||||
{
|
||||
if (m_deselectedMustBeEmpty && !deselected.isEmpty())
|
||||
m_selectionChangedOk = false;
|
||||
|
||||
// Make sure both selections belong to the same model
|
||||
foreach (const QModelIndex &nmi, selected.indexes()) {
|
||||
foreach (const QModelIndex &omi, deselected.indexes()) {
|
||||
m_selectionChangedOk = m_selectionChangedOk && (nmi.model() == omi.model());
|
||||
}
|
||||
}
|
||||
QListView::selectionChanged(selected, deselected);
|
||||
}
|
||||
private:
|
||||
bool m_deselectedMustBeEmpty;
|
||||
bool m_selectionChangedOk;
|
||||
};
|
||||
|
||||
// keep the current/selected row in the "low range", i.e. be sure it's visible, otherwise we
|
||||
@ -2103,7 +2026,7 @@ void tst_QAbstractItemView::QTBUG50535_update_on_new_selection_model()
|
||||
view.selectionModel()->setCurrentIndex(model.index(1, 0), QItemSelectionModel::SelectCurrent);
|
||||
view.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&view));
|
||||
|
||||
QVERIFY(view.selectionChangedOk());
|
||||
|
||||
QItemSelectionModel selectionModel(&model);
|
||||
selectionModel.setCurrentIndex(model.index(2, 0), QItemSelectionModel::Current);
|
||||
@ -2111,6 +2034,7 @@ void tst_QAbstractItemView::QTBUG50535_update_on_new_selection_model()
|
||||
int oldPaintEventsCount = view.m_paintEventsCount;
|
||||
view.setSelectionModel(&selectionModel);
|
||||
QTRY_VERIFY(view.m_paintEventsCount > oldPaintEventsCount);
|
||||
QVERIFY(view.selectionChangedOk());
|
||||
|
||||
|
||||
QItemSelectionModel selectionModel2(&model);
|
||||
@ -2120,6 +2044,19 @@ void tst_QAbstractItemView::QTBUG50535_update_on_new_selection_model()
|
||||
oldPaintEventsCount = view.m_paintEventsCount;
|
||||
view.setSelectionModel(&selectionModel2);
|
||||
QTRY_VERIFY(view.m_paintEventsCount > oldPaintEventsCount);
|
||||
QVERIFY(view.selectionChangedOk());
|
||||
|
||||
// Tests QAbstractItemView::selectionChanged
|
||||
QStandardItemModel model1;
|
||||
for (int i = 0; i < 10; ++i)
|
||||
model1.appendRow(new QStandardItem(QString::number(i)));
|
||||
view.setModel(&model1);
|
||||
|
||||
QItemSelectionModel selectionModel1(&model1);
|
||||
selectionModel1.select(model1.index(0, 0), QItemSelectionModel::ClearAndSelect);
|
||||
selectionModel1.setCurrentIndex(model1.index(1, 0), QItemSelectionModel::Current);
|
||||
view.setSelectionModel(&selectionModel1);
|
||||
QVERIFY(view.selectionChangedOk());
|
||||
}
|
||||
|
||||
void tst_QAbstractItemView::testSelectionModelInSyncWithView()
|
||||
|
@ -31,7 +31,7 @@
|
||||
#include <QtTest/QtTest>
|
||||
#include <QtGui/QtGui>
|
||||
#include <QtWidgets/QtWidgets>
|
||||
#include <private/qabstractitemview_p.h>
|
||||
#include <private/qtreeview_p.h>
|
||||
|
||||
#ifndef QT_NO_DRAGANDDROP
|
||||
Q_DECLARE_METATYPE(QAbstractItemView::DragDropMode)
|
||||
@ -57,49 +57,6 @@ static void initStandardTreeModel(QStandardItemModel *model)
|
||||
model->insertRow(2, item);
|
||||
}
|
||||
|
||||
class tst_QTreeView;
|
||||
struct PublicView : public QTreeView
|
||||
{
|
||||
friend class tst_QTreeView;
|
||||
inline void executeDelayedItemsLayout()
|
||||
{ QTreeView::executeDelayedItemsLayout(); }
|
||||
|
||||
enum PublicCursorAction {
|
||||
MoveUp = QAbstractItemView::MoveUp,
|
||||
MoveDown = QAbstractItemView::MoveDown,
|
||||
MoveLeft = QAbstractItemView::MoveLeft,
|
||||
MoveRight = QAbstractItemView::MoveRight,
|
||||
MoveHome = QAbstractItemView::MoveHome,
|
||||
MoveEnd = QAbstractItemView::MoveEnd,
|
||||
MovePageUp = QAbstractItemView::MovePageUp,
|
||||
MovePageDown = QAbstractItemView::MovePageDown,
|
||||
MoveNext = QAbstractItemView::MoveNext,
|
||||
MovePrevious = QAbstractItemView::MovePrevious
|
||||
};
|
||||
|
||||
// enum PublicCursorAction and moveCursor() are protected in QTreeView.
|
||||
inline QModelIndex doMoveCursor(PublicCursorAction ca, Qt::KeyboardModifiers kbm)
|
||||
{ return QTreeView::moveCursor((CursorAction)ca, kbm); }
|
||||
|
||||
inline void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command)
|
||||
{
|
||||
QTreeView::setSelection(rect, command);
|
||||
}
|
||||
inline int state()
|
||||
{
|
||||
return QTreeView::state();
|
||||
}
|
||||
|
||||
inline int rowHeight(QModelIndex idx) { return QTreeView::rowHeight(idx); }
|
||||
inline int indexRowSizeHint(const QModelIndex &index) const { return QTreeView::indexRowSizeHint(index); }
|
||||
|
||||
inline QModelIndexList selectedIndexes() const { return QTreeView::selectedIndexes(); }
|
||||
|
||||
inline QStyleOptionViewItem viewOptions() const { return QTreeView::viewOptions(); }
|
||||
inline int sizeHintForColumn(int column) const { return QTreeView::sizeHintForColumn(column); }
|
||||
QAbstractItemViewPrivate* aiv_priv() { return static_cast<QAbstractItemViewPrivate*>(d_ptr.data()); }
|
||||
};
|
||||
|
||||
// Make a widget frameless to prevent size constraints of title bars
|
||||
// from interfering (Windows).
|
||||
static inline void setFrameless(QWidget *w)
|
||||
@ -640,33 +597,34 @@ void tst_QTreeView::dragDropModeFromDragEnabledAndAcceptDrops_data()
|
||||
QTest::addColumn<bool>("dragEnabled");
|
||||
QTest::addColumn<bool>("acceptDrops");
|
||||
QTest::addColumn<QAbstractItemView::DragDropMode>("dragDropMode");
|
||||
QTest::addColumn<QAbstractItemView::DragDropMode>("setBehavior");
|
||||
QTest::addColumn<bool>("setBehavior");
|
||||
QTest::addColumn<QAbstractItemView::DragDropMode>("behavior");
|
||||
|
||||
QTest::newRow("NoDragDrop -1") << false << false << QAbstractItemView::NoDragDrop << QAbstractItemView::DragDropMode(-1);
|
||||
QTest::newRow("NoDragDrop 0") << false << false << QAbstractItemView::NoDragDrop << QAbstractItemView::NoDragDrop;
|
||||
QTest::newRow("NoDragDrop 1") << false << false << QAbstractItemView::NoDragDrop << QAbstractItemView::DragOnly;
|
||||
QTest::newRow("NoDragDrop 2") << false << false << QAbstractItemView::NoDragDrop << QAbstractItemView::DropOnly;
|
||||
QTest::newRow("NoDragDrop 3") << false << false << QAbstractItemView::NoDragDrop << QAbstractItemView::DragDrop;
|
||||
QTest::newRow("NoDragDrop 4") << false << false << QAbstractItemView::NoDragDrop << QAbstractItemView::InternalMove;
|
||||
QTest::newRow("DragOnly -1") << true << false << QAbstractItemView::DragOnly << QAbstractItemView::DragDropMode(-1);
|
||||
QTest::newRow("DragOnly 0") << true << false << QAbstractItemView::DragOnly << QAbstractItemView::NoDragDrop;
|
||||
QTest::newRow("DragOnly 1") << true << false << QAbstractItemView::DragOnly << QAbstractItemView::DragOnly;
|
||||
QTest::newRow("DragOnly 2") << true << false << QAbstractItemView::DragOnly << QAbstractItemView::DropOnly;
|
||||
QTest::newRow("DragOnly 3") << true << false << QAbstractItemView::DragOnly << QAbstractItemView::DragDrop;
|
||||
QTest::newRow("DragOnly 4") << true << false << QAbstractItemView::DragOnly << QAbstractItemView::InternalMove;
|
||||
QTest::newRow("DropOnly -1") << false << true << QAbstractItemView::DropOnly << QAbstractItemView::DragDropMode(-1);
|
||||
QTest::newRow("DropOnly 0") << false << true << QAbstractItemView::DropOnly << QAbstractItemView::NoDragDrop;
|
||||
QTest::newRow("DropOnly 1") << false << true << QAbstractItemView::DropOnly << QAbstractItemView::DragOnly;
|
||||
QTest::newRow("DropOnly 2") << false << true << QAbstractItemView::DropOnly << QAbstractItemView::DropOnly;
|
||||
QTest::newRow("DropOnly 3") << false << true << QAbstractItemView::DropOnly << QAbstractItemView::DragDrop;
|
||||
QTest::newRow("DropOnly 4") << false << true << QAbstractItemView::DropOnly << QAbstractItemView::InternalMove;
|
||||
QTest::newRow("DragDrop -1") << true << true << QAbstractItemView::DragDrop << QAbstractItemView::DragDropMode(-1);
|
||||
QTest::newRow("DragDrop 0") << true << true << QAbstractItemView::DragDrop << QAbstractItemView::DragDropMode(-1);
|
||||
QTest::newRow("DragDrop 1") << true << true << QAbstractItemView::DragDrop << QAbstractItemView::NoDragDrop;
|
||||
QTest::newRow("DragDrop 2") << true << true << QAbstractItemView::DragDrop << QAbstractItemView::DragOnly;
|
||||
QTest::newRow("DragDrop 3") << true << true << QAbstractItemView::DragDrop << QAbstractItemView::DropOnly;
|
||||
QTest::newRow("DragDrop 4") << true << true << QAbstractItemView::DragDrop << QAbstractItemView::DragDrop;
|
||||
QTest::newRow("DragDrop 5") << true << true << QAbstractItemView::InternalMove << QAbstractItemView::InternalMove;
|
||||
QTest::newRow("NoDragDrop -1") << false << false << QAbstractItemView::NoDragDrop << false << QAbstractItemView::DragDropMode();
|
||||
QTest::newRow("NoDragDrop 0") << false << false << QAbstractItemView::NoDragDrop << true << QAbstractItemView::NoDragDrop;
|
||||
QTest::newRow("NoDragDrop 1") << false << false << QAbstractItemView::NoDragDrop << true << QAbstractItemView::DragOnly;
|
||||
QTest::newRow("NoDragDrop 2") << false << false << QAbstractItemView::NoDragDrop << true << QAbstractItemView::DropOnly;
|
||||
QTest::newRow("NoDragDrop 3") << false << false << QAbstractItemView::NoDragDrop << true << QAbstractItemView::DragDrop;
|
||||
QTest::newRow("NoDragDrop 4") << false << false << QAbstractItemView::NoDragDrop << true << QAbstractItemView::InternalMove;
|
||||
QTest::newRow("DragOnly -1") << true << false << QAbstractItemView::DragOnly << false << QAbstractItemView::DragDropMode();
|
||||
QTest::newRow("DragOnly 0") << true << false << QAbstractItemView::DragOnly << true << QAbstractItemView::NoDragDrop;
|
||||
QTest::newRow("DragOnly 1") << true << false << QAbstractItemView::DragOnly << true << QAbstractItemView::DragOnly;
|
||||
QTest::newRow("DragOnly 2") << true << false << QAbstractItemView::DragOnly << true << QAbstractItemView::DropOnly;
|
||||
QTest::newRow("DragOnly 3") << true << false << QAbstractItemView::DragOnly << true << QAbstractItemView::DragDrop;
|
||||
QTest::newRow("DragOnly 4") << true << false << QAbstractItemView::DragOnly << true << QAbstractItemView::InternalMove;
|
||||
QTest::newRow("DropOnly -1") << false << true << QAbstractItemView::DropOnly << false << QAbstractItemView::DragDropMode();
|
||||
QTest::newRow("DropOnly 0") << false << true << QAbstractItemView::DropOnly << true << QAbstractItemView::NoDragDrop;
|
||||
QTest::newRow("DropOnly 1") << false << true << QAbstractItemView::DropOnly << true << QAbstractItemView::DragOnly;
|
||||
QTest::newRow("DropOnly 2") << false << true << QAbstractItemView::DropOnly << true << QAbstractItemView::DropOnly;
|
||||
QTest::newRow("DropOnly 3") << false << true << QAbstractItemView::DropOnly << true << QAbstractItemView::DragDrop;
|
||||
QTest::newRow("DropOnly 4") << false << true << QAbstractItemView::DropOnly << true << QAbstractItemView::InternalMove;
|
||||
QTest::newRow("DragDrop -1") << true << true << QAbstractItemView::DragDrop << false << QAbstractItemView::DragDropMode();
|
||||
QTest::newRow("DragDrop 0") << true << true << QAbstractItemView::DragDrop << false << QAbstractItemView::DragDropMode();
|
||||
QTest::newRow("DragDrop 1") << true << true << QAbstractItemView::DragDrop << true << QAbstractItemView::NoDragDrop;
|
||||
QTest::newRow("DragDrop 2") << true << true << QAbstractItemView::DragDrop << true << QAbstractItemView::DragOnly;
|
||||
QTest::newRow("DragDrop 3") << true << true << QAbstractItemView::DragDrop << true << QAbstractItemView::DropOnly;
|
||||
QTest::newRow("DragDrop 4") << true << true << QAbstractItemView::DragDrop << true << QAbstractItemView::DragDrop;
|
||||
QTest::newRow("DragDrop 5") << true << true << QAbstractItemView::InternalMove << true << QAbstractItemView::InternalMove;
|
||||
}
|
||||
|
||||
void tst_QTreeView::dragDropModeFromDragEnabledAndAcceptDrops()
|
||||
@ -674,13 +632,14 @@ void tst_QTreeView::dragDropModeFromDragEnabledAndAcceptDrops()
|
||||
QFETCH(bool, acceptDrops);
|
||||
QFETCH(bool, dragEnabled);
|
||||
QFETCH(QAbstractItemView::DragDropMode, dragDropMode);
|
||||
QFETCH(QAbstractItemView::DragDropMode, setBehavior);
|
||||
QFETCH(bool, setBehavior);
|
||||
QFETCH(QAbstractItemView::DragDropMode, behavior);
|
||||
|
||||
QTreeView view;
|
||||
QCOMPARE(view.dragDropMode(), QAbstractItemView::NoDragDrop);
|
||||
|
||||
if (setBehavior != QAbstractItemView::DragDropMode(-1))
|
||||
view.setDragDropMode(setBehavior);
|
||||
if (setBehavior)
|
||||
view.setDragDropMode(behavior);
|
||||
|
||||
view.setAcceptDrops(acceptDrops);
|
||||
view.setDragEnabled(dragEnabled);
|
||||
@ -1752,7 +1711,7 @@ void tst_QTreeView::moveCursor()
|
||||
QFETCH(bool, scrollPerPixel);
|
||||
QtTestModel model(8, 6);
|
||||
|
||||
PublicView view;
|
||||
QTreeView view;
|
||||
view.setUniformRowHeights(uniformRowHeights);
|
||||
view.setModel(&model);
|
||||
view.setRowHidden(0, QModelIndex(), true);
|
||||
@ -1771,7 +1730,7 @@ void tst_QTreeView::moveCursor()
|
||||
QCOMPARE(view.currentIndex(), expected);
|
||||
|
||||
//then pressing down should go to the next line
|
||||
QModelIndex actual = view.doMoveCursor(PublicView::MoveDown, Qt::NoModifier);
|
||||
QModelIndex actual = view.moveCursor(QTreeView::MoveDown, Qt::NoModifier);
|
||||
expected = model.index(2, 1, QModelIndex());
|
||||
QCOMPARE(actual, expected);
|
||||
|
||||
@ -1780,7 +1739,7 @@ void tst_QTreeView::moveCursor()
|
||||
|
||||
// PageUp was broken with uniform row heights turned on
|
||||
view.setCurrentIndex(model.index(1, 0));
|
||||
actual = view.doMoveCursor(PublicView::MovePageUp, Qt::NoModifier);
|
||||
actual = view.moveCursor(QTreeView::MovePageUp, Qt::NoModifier);
|
||||
expected = model.index(0, 0, QModelIndex());
|
||||
QCOMPARE(actual, expected);
|
||||
|
||||
@ -1879,7 +1838,7 @@ void tst_QTreeView::setSelection()
|
||||
QtTestModel model(10, 5);
|
||||
model.levels = 1;
|
||||
model.setDecorationsEnabled(true);
|
||||
PublicView view;
|
||||
QTreeView view;
|
||||
view.resize(400, 300);
|
||||
view.show();
|
||||
view.setRootIsDecorated(false);
|
||||
@ -2067,7 +2026,7 @@ void tst_QTreeView::rowsAboutToBeRemoved()
|
||||
}
|
||||
}
|
||||
|
||||
PublicView view;
|
||||
QTreeView view;
|
||||
view.setModel(&model);
|
||||
view.show();
|
||||
QModelIndex index = model.index(0,0, QModelIndex());
|
||||
@ -2081,7 +2040,7 @@ void tst_QTreeView::rowsAboutToBeRemoved()
|
||||
QSignalSpy spy1(&model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)));
|
||||
|
||||
model.removeRows(1,1);
|
||||
QCOMPARE(view.state(), 0);
|
||||
QCOMPARE(int(view.state()), 0);
|
||||
// Should not be 5 (or any other number for that sake :)
|
||||
QCOMPARE(spy1.count(), 1);
|
||||
|
||||
@ -2184,7 +2143,7 @@ void tst_QTreeView::rowsAboutToBeRemoved_move()
|
||||
view.resize(600,800);
|
||||
view.show();
|
||||
view.doItemsLayout();
|
||||
static_cast<PublicView *>(&view)->executeDelayedItemsLayout();
|
||||
static_cast<QTreeView *>(&view)->executeDelayedItemsLayout();
|
||||
parent = indexThatWantsToLiveButWillDieDieITellYou.parent();
|
||||
QCOMPARE(view.isExpanded(indexThatWantsToLiveButWillDieDieITellYou), true);
|
||||
QCOMPARE(parent.isValid(), true);
|
||||
@ -2292,7 +2251,7 @@ void tst_QTreeView::spanningItems()
|
||||
{
|
||||
QtTestModel model;
|
||||
model.rows = model.cols = 10;
|
||||
PublicView view;
|
||||
QTreeView view;
|
||||
view.setModel(&model);
|
||||
view.show();
|
||||
|
||||
@ -2431,7 +2390,7 @@ void tst_QTreeView::selectionWithHiddenItems()
|
||||
void tst_QTreeView::selectAll()
|
||||
{
|
||||
QStandardItemModel model(4,4);
|
||||
PublicView view2;
|
||||
QTreeView view2;
|
||||
view2.setModel(&model);
|
||||
view2.setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
view2.selectAll(); // Should work with an empty model
|
||||
@ -2440,13 +2399,13 @@ void tst_QTreeView::selectAll()
|
||||
|
||||
for (int i = 0; i < model.rowCount(); ++i)
|
||||
model.setData(model.index(i,0), QLatin1String("row ") + QString::number(i));
|
||||
PublicView view;
|
||||
QTreeView view;
|
||||
view.setModel(&model);
|
||||
int selectedCount = view.selectedIndexes().count();
|
||||
view.selectAll();
|
||||
QCOMPARE(view.selectedIndexes().count(), selectedCount);
|
||||
|
||||
PublicView view3;
|
||||
QTreeView view3;
|
||||
view3.setModel(&model);
|
||||
view3.setSelectionMode(QAbstractItemView::NoSelection);
|
||||
view3.selectAll();
|
||||
@ -2809,7 +2768,7 @@ void tst_QTreeView::evilModel()
|
||||
{
|
||||
QFETCH(bool, visible);
|
||||
// init
|
||||
PublicView view;
|
||||
QTreeView view;
|
||||
EvilModel model;
|
||||
view.setModel(&model);
|
||||
view.setVisible(visible);
|
||||
@ -2867,7 +2826,7 @@ void tst_QTreeView::evilModel()
|
||||
view.setSelection(rect, QItemSelectionModel::Select);
|
||||
model.change();
|
||||
|
||||
view.doMoveCursor(PublicView::MoveDown, Qt::NoModifier);
|
||||
view.moveCursor(QTreeView::MoveDown, Qt::NoModifier);
|
||||
model.change();
|
||||
|
||||
view.resizeColumnToContents(1);
|
||||
@ -2978,7 +2937,7 @@ void tst_QTreeView::evilModel()
|
||||
void tst_QTreeView::indexRowSizeHint()
|
||||
{
|
||||
QStandardItemModel model(10, 1);
|
||||
PublicView view;
|
||||
QTreeView view;
|
||||
|
||||
view.setModel(&model);
|
||||
|
||||
@ -3024,7 +2983,7 @@ void tst_QTreeView::renderToPixmap_data()
|
||||
void tst_QTreeView::renderToPixmap()
|
||||
{
|
||||
QFETCH(int, row);
|
||||
PublicView view;
|
||||
QTreeView view;
|
||||
QStandardItemModel model;
|
||||
|
||||
model.appendRow(new QStandardItem("Spanning"));
|
||||
@ -3040,7 +2999,7 @@ void tst_QTreeView::renderToPixmap()
|
||||
// We select the index at row=1 for coverage.
|
||||
QItemSelection sel(model.index(row,0), model.index(row,1));
|
||||
QRect rect;
|
||||
view.aiv_priv()->renderToPixmap(sel.indexes(), &rect);
|
||||
view.d_func()->renderToPixmap(sel.indexes(), &rect);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -3102,7 +3061,7 @@ void tst_QTreeView::styleOptionViewItem()
|
||||
bool allCollapsed;
|
||||
};
|
||||
|
||||
PublicView view;
|
||||
QTreeView view;
|
||||
QStandardItemModel model;
|
||||
view.setModel(&model);
|
||||
MyDelegate delegate;
|
||||
@ -3158,7 +3117,7 @@ void tst_QTreeView::styleOptionViewItem()
|
||||
delegate.count = 0;
|
||||
QItemSelection sel(model.index(0,0), model.index(0,modelColumns-1));
|
||||
QRect rect;
|
||||
view.aiv_priv()->renderToPixmap(sel.indexes(), &rect);
|
||||
view.d_func()->renderToPixmap(sel.indexes(), &rect);
|
||||
if (delegate.count != visibleColumns) {
|
||||
qDebug() << rect << view.rect() << view.isVisible();
|
||||
}
|
||||
@ -3186,7 +3145,7 @@ void tst_QTreeView::styleOptionViewItem()
|
||||
delegate.count = 0;
|
||||
QItemSelection sel(model.index(0,0), model.index(0,modelColumns-1));
|
||||
QRect rect;
|
||||
view.aiv_priv()->renderToPixmap(sel.indexes(), &rect);
|
||||
view.d_func()->renderToPixmap(sel.indexes(), &rect);
|
||||
if (delegate.count != visibleColumns) {
|
||||
qDebug() << rect << view.rect() << view.isVisible();
|
||||
}
|
||||
@ -4148,7 +4107,7 @@ void tst_QTreeView::taskQTBUG_13567_removeLastItemRegression()
|
||||
// Note: define QT_BUILD_INTERNAL to run this test
|
||||
void tst_QTreeView::taskQTBUG_25333_adjustViewOptionsForIndex()
|
||||
{
|
||||
PublicView view;
|
||||
QTreeView view;
|
||||
QStandardItemModel model;
|
||||
QStandardItem *item1 = new QStandardItem("Item1");
|
||||
QStandardItem *item2 = new QStandardItem("Item2");
|
||||
@ -4174,9 +4133,9 @@ void tst_QTreeView::taskQTBUG_25333_adjustViewOptionsForIndex()
|
||||
{
|
||||
QStyleOptionViewItem option;
|
||||
|
||||
view.aiv_priv()->adjustViewOptionsForIndex(&option, model.indexFromItem(item1));
|
||||
view.d_func()->adjustViewOptionsForIndex(&option, model.indexFromItem(item1));
|
||||
|
||||
view.aiv_priv()->adjustViewOptionsForIndex(&option, model.indexFromItem(item3));
|
||||
view.d_func()->adjustViewOptionsForIndex(&option, model.indexFromItem(item3));
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -4282,7 +4241,7 @@ void tst_QTreeView::quickExpandCollapse()
|
||||
//this unit tests makes sure the state after the animation is restored correctly
|
||||
//after starting a 2nd animation while the first one was still on-going
|
||||
//this tests that the stateBeforeAnimation is not set to AnimatingState
|
||||
PublicView tree;
|
||||
QTreeView tree;
|
||||
tree.setAnimated(true);
|
||||
QStandardItemModel model;
|
||||
QStandardItem *root = new QStandardItem("root");
|
||||
@ -4296,13 +4255,13 @@ void tst_QTreeView::quickExpandCollapse()
|
||||
tree.show();
|
||||
QTest::qWaitForWindowExposed(&tree);
|
||||
|
||||
int initialState = tree.state();
|
||||
const QAbstractItemView::State initialState = tree.state();
|
||||
|
||||
tree.expand(rootIndex);
|
||||
QCOMPARE(tree.state(), (int)PublicView::AnimatingState);
|
||||
QCOMPARE(tree.state(), QTreeView::AnimatingState);
|
||||
|
||||
tree.collapse(rootIndex);
|
||||
QCOMPARE(tree.state(), (int)PublicView::AnimatingState);
|
||||
QCOMPARE(tree.state(), QTreeView::AnimatingState);
|
||||
|
||||
QTest::qWait(500); //the animation lasts for 250ms max so 500 should be enough
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user