我要疯了.我在ScrollView中有一个ListView,连接到一个继承QAbstractListModel的模型.将对象添加到模型时,ListView使用委托显示它们.到现在为止还挺好.
但我真的希望视图保持滚动到底部(就像聊天窗口一样),而且我很难实现这一点.这是相关的QML代码:
Rectangle {
ScrollView {
[anchor stuff]
ListView {
id: messageList
model: textMessageFiltered
delegate: messageDelegate
}
}
TextField {
id: messageEditor
[anchor stuff]
onAccepted: {
controller.sendTextMessage(text)
text = ""
/* This works. */
//messageList.positionViewAtEnd();
}
}
Component {
id: messageDelegate
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
color: "white"
height: nameText.height + 4
Text {
id: nameText
wrapMode: Text.Wrap
text: "<b>" + authorName + " (" + authorId + ")</b> " + message
[anchor stuff]
}
ListView.onAdd: {
console.log("This prints …
Run Code Online (Sandbox Code Playgroud) 我已经建立了QMenu MainMenu
我的上顶MainWindow
在我的应用程序.每个人都习惯了,我有以下QMenu
主菜单:
文件 - 编辑 - SuperHeavyExpertMenus - 设置 - 帮助
我想SuperHeaverExpertMenus
在程序启动时最初隐藏子树,因为它会包含很多设置,这可能会使初学者用户感到困惑.
例如,我想SuperHeavyExpertMenu
在"设置"中的复选框为真时显示该子树.
我可以隐藏孩子QActions
的的QMenu
上述S,争夺QAction:setVisible(false)
.但我能做到这一点QMenu
吗?
有没有办法隐藏QMenu
?
我创建了一个简单的程序来重现问题.当我锁定手机,或者如果我切换到我的Android手机中的另一个应用程序时,工作线程继续打印,但事件循环停止.当我切换回我的应用程序时,事件循环重新开始.
如果我用QCoreApplication替换QGuiApplication,问题就会消失.如果我用Qt 5.2而不是Qt 5.3编译,问题就会消失.Qt 5.4与Qt 5.3具有相同的问题.
static int count = 0;
void workerThread()
{
while (1) {
qDebug("Worker thread %d", count++);
sleep(1);
}
}
void MyObject::step()
{
qDebug("Event loop %d", count++);
}
int main(int argc, char *argv[])
{
QGuiApplication a(argc, argv);
MyObject w;
QTimer timer;
QObject::connect(&timer, SIGNAL(timeout()), &w, SLOT(step()));
timer.start(1000);
QtConcurrent::run(workerThread);
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
当应用程序失去焦点时,如何阻止QGuiApplication停止事件循环?我需要我的应用程序来处理事件,即使不在前台.
单击按钮打开另一个 QML 窗口时,我需要隐藏 QML 窗口,我使用 Loader 打开另一个 QML 窗口,它只隐藏 QML 表单组件而不是 QML 窗口,但我目前使用窗口组件打开 QML 窗口
这是我的代码:
Button {
id: button2
x: 19
y: 54
width: 114
height: 25
text: qsTr("DIFF-R")
style: ButtonStyle {
background: Rectangle {
implicitWidth: 10
implicitHeight: 25
border.width: control.activeFocus ? 2 : 1
border.color: "#555"
radius: 10
gradient: Gradient {
GradientStop { position: 0 ; color: control.pressed ? "#ddd" : "#fff" }
GradientStop { position: 1 ; color: control.pressed ? "#8ad993" : "#528dc8" }
}
}
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用qt5(5.3.2)在运行Raspbian-Jessie的Raspberry pi 3上编译一些qml.
我设法运行一些简单的东西但现在我需要使用QtQuick.Controls所以我添加import QtQuick.Controls 1.0
到我的qml
文件但是当我尝试运行它时,我收到此错误消息:module "QtQuick.Controls" is not installed
Qt安装在以下文件夹中/usr/lib/arm-linux-gnueabihf/qt5/
(它是自动检测到的)所以我去那里发现QtQuick Controls实际上在那里(中[path to qt]/qml/QtQuick/Controls
)
我是否需要做一些实际的安装?
我试图添加/usr/lib/arm-linux-gnueabihf/qt5/qml/QtQuick/Controls
,QML_IMPORT_PATH
但我仍然收到错误消息.
我也看过,我需要QtQuick 2.0 QtQuick.Controls工作,但是当我改变import QtQuick 1.0
到import QtQuick 2.0
我得到一个module "QtQuick" version 2.0 is not installed
任何人都设法在树莓派使用QtQuick.Controls?
关于如何调试这个的任何建议?
我正在开发一个Qt(5.3)桌面应用程序(带有QML ui的C++核心),其主窗口是一个ApplicationWindow
,并且在某些时候启动Dialog
s.由于在Windows和Mac OS X之间使用对话框模式存在差异(例如,关于对话框在Mac OS X上很少是模态的,但在Windows上几乎总是模态的),而且在呈现一些对话框的内容方面,我也是我们改变了设计,允许实现特定于平台的对话框版本.
为此我创建了以下DialogLoader:
Loader {
id: dialogFactory
property string dialogName
function platformFolder() {
if (Qt.platform.os === "osx")
return "osx"
return "win"
}
onDialogNameChanged: { source = platformFolder() + "/" + dialogName + ".qml" }
onStatusChanged: {
if (dialogFactory.status === Loader.Error)
console.log("DialogFactory: failed to load file: " + source);
else if (dialogFactory.status === Loader.Ready)
console.log("DialogFactory: file \"" + source + "\" loaded")
}
}
Run Code Online (Sandbox Code Playgroud)
我用的如下:
ApplicationWindow {
// …
property alias …
Run Code Online (Sandbox Code Playgroud) 我试图在QT QTextEdit框中粘贴表情符号,但它没有被识别,它显示为??? 要么 [][]
我不是在谈论笑脸,我在谈论表情符号.
我怎样才能确保QT的QTextEdit接受表情符号并正确显示它们?
谢谢.
根据以下有用的答案得到它:
解:
QFontDatabase fontDB;
fontDB.addApplicationFont(":/Resources/fonts/seguisym.ttf");
QApplication::setFont(QFont(QStringLiteral("Segoe UI Symbol")));
Run Code Online (Sandbox Code Playgroud) 我想将我的全局qss
样式表与派生类一起使用.我知道我必须覆盖paintEvent
(样式表参考,或在这里).
void CustomWidget::paintEvent(QPaintEvent *) {
QStyleOption opt;
opt.init(this); // tried initFrom too, same result=>not working
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
Run Code Online (Sandbox Code Playgroud)
但是,它似乎不起作用.使用CDerived:QWidget
和我面对的以下样式表行:
CDerived { background-color: black; } // no effect
QWidget { background-color: black; } // works
Run Code Online (Sandbox Code Playgroud)
CDerived
实施paintEvent
如上.还有什么我需要做的吗?
- 编辑/解决方案 -
感谢JK的提示,我已经弄明白了.我上面的例子实际上没有正确反映我的场景.我真正的类位于C++命名空间中(我错过了我的错误).所以我必须写MyNamespace--CDerived
在qss中.请参阅" C++命名空间内的小部件 "
在我尝试了JK的简单例子后,我突然意识到自己的错误!
纠正一个:
MyNamespace--CDerived { background-color: black; } // works, use -- for ::
Run Code Online (Sandbox Code Playgroud)
我有一个带有复选框的列QTableView
。该复选框由以下生成:
Qt::ItemIsUserCheckable
覆盖的flags
成员函数data()
函数中,我根据数据返回一个Qt::CheckState
forrole == Qt::CheckStateRole
有效,见截图。
但在复选框旁边,我在列中有一些可编辑的文本框。我怎样才能摆脱这个文本框(我在其中输入了“dsdsdsds”进行演示?澄清一下,复选框应该是可编辑的,但没有别的。
根据要求,我只能显示简化版
Qt::ItemFlags MyClass::flags(const QModelIndex &index) const {
Qt::ItemFlags f = QAbstractListModel::flags(index);
... return f if index is not target column ....
// for target column with checkbox
return (f | Qt::ItemIsEditable | Qt::ItemIsUserCheckable; )
}
QVariant MyClass::data(const QModelIndex &index, int role) const {
.. do something for other columns
.. for checkbox column
if (role != Qt::CheckStateRole) { …
Run Code Online (Sandbox Code Playgroud) 我在Raspberry pi 2 B Model上安装了Qt creator(Qt5)及其示例.我正在运行Raspbian Jessie.我试图运行一个视频播放器示例,但我最终得到一个错误,如下所示:
启动/ usr/lib目录/ ARM-Linux的gnueabihf/QT5 /例子/ multimediawidgets /建造玩家 - 桌面 - 调试器/播放器... libEGL警告:GLX/DRI2不支持libEGL警告:DRI2:无法验证
(播放器:841):GStreamer-CRITICAL**:gst_object_ref_sink:断言'GST_IS_OBJECT(对象)'GStreamer失败; 无法播放 - "file:///home/pi/Desktop/test_video.mp4"GStreamer; 无法播放 - "file:///home/pi/Desktop/test_video.mp4"警告:"没有解码器可用于类型'video/quicktime,variant =(string)iso'."
请让我知道如何解决这些"Gstreamer"和"No decoder"的问题.